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」を1つのクエリにまとめます。

編集

実際、これを次のように単純化することができます。

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 に答える