Сглаживание запроса Linq Group - PullRequest
8 голосов
/ 06 апреля 2009

У меня есть список данных примерно так:

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 ]

10 голосов
/ 06 апреля 2009

Вы всегда можете вкладывать свои запросы:

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

Это, кажется, дает правильный результат.

3 голосов
/ 06 апреля 2009

Почему бы вам не select g.First() вместо?

2 голосов
/ 06 апреля 2009
var finalList = list
  .GroupBy(c => c.ID)
  .Select(g => g.OrderByDescending(c => c.AddressPurpose).First())
  .ToList();
...