linqを使用して一意に選択する [重複] 質問する

linqを使用して一意に選択する [重複] 質問する

私はクラスのクラスリストを持っています

public class LinqTest
{
public int id { get; set; }
public string value { get; set; }
}


List<LinqTest> myList = new List<LinqTest>();
myList.Add(new LinqTest() { id = 1, value = "a" });
myList.Add(new LinqTest() { id = 1, value = "b" });
myList.Add(new LinqTest() { id = 2, value = "c" });

そのリストから異なるIDのみを選択する必要があります。つまり、結果のリストには次のものだけが含まれる必要があります。

[{id=1,value="a"},{ id = 2, value = "c" }]

linq でこれを実行するにはどうすればよいですか?

編集

入力、

id      value
1        a
1        b
2        c
3        d
3        e

出力は、

id      value
1        a
2        c
3        d

つまり、 の繰り返しがある場合id、結果は最初の出現のみを取得します。

ベストアンサー1

myList.GroupBy(test => test.id)
      .Select(grp => grp.First());

編集: これを理解することは多くの人にとって謎であるように思われるのでIEnumerable<>List<>次のように書くだけで済みます:

var result = myList.GroupBy(test => test.id)
                   .Select(grp => grp.First())
                   .ToList();

しかし、上記の Linq は遅延評価されるため、IEnumerableではなくを使用する方がよい場合が多くあります。列挙可能オブジェクトが反復処理されるまで、実際にはすべての作業は実行されません。 を呼び出すと、実際には列挙可能オブジェクト全体が処理され、すべての作業が事前に実行されるようになります。(列挙可能オブジェクトが無限に長い場合は、少し時間がかかることがあります。)IListToList

このアドバイスの裏返しは、そのような を列挙するたびに、それを評価する作業を新たに行う必要があるということです。したがって、遅延評価された で作業する方がよいのか、それを、、などに実現する方がIEnumerableよいのかをケースごとに決定する必要があります。IEnumerableListSetDictionary

おすすめ記事