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。
答案 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);
并询问为什么有时会打印零。