IEnumerable为List,不返回数据

时间:2015-09-04 17:27:19

标签: c# linq generics

 Public class Class1
    {
       Public int Id {get; set;}
       Public int code {get; set;}
       Public int item1 {get; set;}
       Public int item2 {get; set;}
       Public string data {get; set;}
    }  

    //List filled here
    List<Class1> MyList = GetData();

    int[] codes = {1, 2, 3};       

    IEnumerable<Class1> groupItems = new List<Class1>();

    //Grouping and ordering logic here
    foreach(int code in codes)
    {
        groupItems =   MyList.GroupBy(g => g.Id)
                        .Where(w => w.Any(a => a.Code = code)
                        .Select(s => new 
                                    { key = s.Key, 
                                      items = s.OrderBy(o => o.Item1)
                                               .ThenBy(t => t.Item2)
                                     }
                                )
                                .OrderBy(o => o.Key)
                                .SelectMany(sm => sm.Items);
     }

     MyList.Clear();
     MyList.InsertRange(0, groupItems.ToList());

从上面的代码输出中,MyList在结果中为空。我在这里做错了什么?

在groupItems上,它是Ienumerable,同时添加到MyList。我正在使用ToList()转换为List。

2 个答案:

答案 0 :(得分:1)

你应该避免使用for,它将始终返回groupItems的最后一个结果,该结果可以是一个空列表。请改用code中的包含。

groupItems =   MyList.GroupBy(g => g.Id)
                        .Where(w => codes.Contains(w.Code))
                        .Select(s => new 
                                    { key = s.Key, 
                                      items = s.OrderBy(o => o.Item1)
                                               .ThenBy(t => t.Item2)
                                     }
                                )
                                .OrderBy(o => o.Key)
                                .SelectMany(sm => sm.Items);

答案 1 :(得分:1)

Fals做了很好的尝试,但查询没有意义。

可以简单地实现相同的结果
var items = from e in MyList where codes.Contains(e.Code)
            orderby e.Id, e.Item1, e.Item2 select e;  

(我通常更喜欢lambda语法,但这是LINQ语法更适合的情况之一)

编辑:但是,请忘记查询的冗余和低效率,并回到原始问题。 Fals 已经在他的回答中做到了,但似乎你错过了那部分。你的代码有什么问题,你在循环之外定义一个变量,然后在循环内你只需一个值分配给相同的变量,最后你<退出循环后强>输入变量。这没有意义,因为变量将包含您在上一次迭代中分配的内容。在您的情况下,即使MyList不为空,如果没有Code == 3的项目,您也会获得空结果。它类似于写这样的东西

var random = new Random();
int result = 1234;
for (int i = 0; i < 3; i++)
    result = random.Next(3);
Console.WriteLine(result);

并询问为什么有时会打印零。