2015-09-04 54 views
0
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在结果中是空的。我在这里做错了什么?IEnumerable to List,不返回数据

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

+0

快速一瞥,这可能是因为您使用'a.Code = code'作为一个=而不是'=='('a.Code == code') –

+2

@ stephen.vakil:其实,那应该根本不用编译,原因很多。 – SLaks

+0

@Slaks:我的代码或问题中的代码?我在编译的问题中假定了代码,因为问题是,它为什么是空的,而不是,为什么不编译。 –

回答

1

你应该避免for,它总会返回groupItems的最后一个结果,它可以是一个空列表。改为使用code中的Contains。

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); 
+0

where条件不编译。 – user472269

+0

哪个错误?我没有所有这些班级都不能帮助你这样! – Fals

+1

'w'是'IGrouping ',因此不具有'Code'属性。你需要切换'GroupBy'和'Where'(哪个更好) –

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); 

,并问为什么它是印刷零的时候。

+0

我正在对组中的项目进行分组和排序。 – user472269

+0

正确,但用“SelectMany”将它们“取消组合”。所以结果是一样的。 –

+0

Opps在'orderby'中使用了错误的字段 - 已修复。 –