8

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

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 的情况下做到这一点?

4

3 回答 3

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

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

于 2009-04-06T02:30:47.193 回答
3

你为什么不select g.First()代替?

于 2009-04-06T02:32:08.220 回答
2
var finalList = list
  .GroupBy(c => c.ID)
  .Select(g => g.OrderByDescending(c => c.AddressPurpose).First())
  .ToList();
于 2009-04-06T17:07:06.633 回答