1. ホーム
  2. c#

[解決済み】linqを使用したSelect distinct [重複]。

2022-04-02 02:04:24

質問

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

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

Out putはこうあるべき。

id      value
1        a
2        c
3        d

の繰り返しがある場合、その繰り返しを削除します。 id の場合、result は最初に発生したものだけを取ります。

どのように解決するのですか?

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

編集:このようになります IEnumerable<>List<> は謎が多いようですが、単純に書けばいいのです。

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

しかし、多くの場合 IEnumerable よりも、むしろ IList のように、上のLinqは遅延評価されます:列挙可能なものが反復されるまで、実際にはすべての作業を行いません。列挙が反復されるまで実際にはすべての作業を行いません。 ToList は、実際に列挙可能なもの全体を走査するので、すべての作業を前もって行わなければなりません。(そして、列挙が無限に長い場合は、少し時間がかかるかもしれません。)

このアドバイスの裏側には、このような列挙のたびに IEnumerable を評価するための作業を新たに行わなければならない。ですから、それぞれのケースで、遅延評価された IEnumerable または List , Set , Dictionary といった具合です。