我需要在一个列表中对项目进行分组,然后将每组传递给一个函数进行进一步的细化.
var list = new List<MyObj>(); // list is created ad populated elsewhere in code...
var query = list.AsEnumerable();
query = query.Where(x => x.MyProp == true).Select(x => x); // query definition is way more complicated
var grp = query.GroupBy(x => new { x.Name, x.Surname }).ToList();
此处grp
为List<IGrouping<'a, MyObj>>
型.
我可以使用以下工具轻松地遍历我的项目:
foreach (var g in grp)
{
foreach (var o in g)
{
// here "o" is of type MyObj
}
}
但我不知道如何创建一个函数来接收组并遍历其项:
foreach (var g in grp)
{
DoSomethingWithGroup(g);
}
这是因为我在grp定义中有一个匿名类型(键).
我试图用自定义类型替换密钥匿名类型:
private class GrpKey
{
public string Name { get; set; }
public string Surname { get; set; }
}
/* ... */
var grp = query.GroupBy(x => new GrpKey { Name = x.Name, Surname = x.Surname }).ToList();
这样,grp的类型为List<IGrouping<MyGrpKey, MyObj>>
,而不是List<IGrouping<'a, MyObj>>
.
然后我可以创建一个函数:
private void DoSomethingWithGroup(IGrouping<MyGrpKey, MyObj>) { /* ... */ }
不幸的是,这种分组方式不再有效:grp现在包含的组与源列表中的项一样多,每个组都有一个项.