私はクラスのクラスリストを持っています
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
ではなくを使用する方がよい場合が多くあります。列挙可能オブジェクトが反復処理されるまで、実際にはすべての作業は実行されません。 を呼び出すと、実際には列挙可能オブジェクト全体が処理され、すべての作業が事前に実行されるようになります。(列挙可能オブジェクトが無限に長い場合は、少し時間がかかることがあります。)IList
ToList
このアドバイスの裏返しは、そのような を列挙するたびに、それを評価する作業を新たに行う必要があるということです。したがって、遅延評価された で作業する方がよいのか、それを、、などに実現する方がIEnumerable
よいのかをケースごとに決定する必要があります。IEnumerable
List
Set
Dictionary