展平Linq Group查询

时间:2009-04-06 02:16:45

标签: c# linq group-by linq-to-objects

我有一个像这样的数据列表:

ID AddressPurpose Address ...
1  L
1  P
2  L
2  P
3  P
3  L
4  P
4  L
5  P
6  L

我希望能够过滤数据,以便对于每个唯一的数字,如果有P行,则返回,否则返回L行。所以数据看起来像这样:

ID AddressPurpose Address ...
1  P
2  P
3  P
4  P
5  P
6  L

目前我的查询工作正常:

var query = from c in list
            orderby c.AddressPurpose descending
            group c by c.ID
            into g
                select g;

var finalList = new List<Company>();
foreach (var list in query)
{
    finalList.Add(list.First());
}
return finalList;

如果不使用额外的foreach,有没有更好的方法呢?

3 个答案:

答案 0 :(得分:10)

您可以随时嵌套查询:

var query =
    from i in (
        from c in list 
        orderby c.AddressPurpose descending 
        group c by c.ID into g 
        select g)
    select i.First();

return query;

我确信这不是唯一的方法(或者甚至可能是最好的方式),但它确实将你的“foreach”包装到一个查询中。

修改

事实上,您可以将其简化为:

var query = from c in list
            orderby c.AddressPurpose descending
            group c by c.ID into g
            select g.First();

这似乎给出了正确的结果。

答案 1 :(得分:3)

为什么不select g.First()呢?

答案 2 :(得分:2)

var finalList = list
  .GroupBy(c => c.ID)
  .Select(g => g.OrderByDescending(c => c.AddressPurpose).First())
  .ToList();