Linqを使用してオブジェクトのリストからプロパティの一意のリストを取得するにはどうすればよいですか?


171

Linqを使用して、IDがプロパティであるオブジェクトのリストを指定してIDのリストを返そうとしています。各オブジェクトをループして、見つけた一意のIDを引き出すことなく、これを実行できるようにしたいと思います。

MyClassタイプのオブジェクトのリストがあり、このクラスのプロパティの1つはIDです。

public class MyClass
{
  public int ID { get; set; }
}

私がしたいことは、それらのIDのリストを返すLinqクエリを作成することです

idをIList<MyClass>返すような方法でそれを行うにはどうすればよいIEnumerable<int>ですか?

MyClassリストの各項目をループして一意の値をリストに追加するのではなく、Linqを使用して1行または2行で実行できるはずです。

エレガントなソリューションを作成するための助けがあれば大歓迎です!


1
また、あなたが持っている注意DistinctByMoreLinqあなたに明確な与えるであろうMyClassに基づい秒ID。使用法:var distincts = list.DistinctBy(x => x.ID);
nawfal 2013年

回答:


319
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();

うわー!単純なことだと思ったのですが…。Linqに慣れるのにもう少し時間を費やす必要があるようです。
メゾイド2009

29

Distinct演算子を使用します

var idList = yourList.Select(x=> x.ID).Distinct();

5
(マイナーネーミングポイント。これはIDの「リスト」ではありません-遅延評価されたIEnumerable <int>です。もちろん、.ToList()を呼び出さない限り、;
Marc Gravell

@Marc、怠惰なevalの単純な2行の外植?どうぞよろしくお願いします:D
masfenix 2010年

2
@masfenix Lazy evalは、実際に使用されるまで操作が行われないことを意味します。この場合、IDの選択と個別のIDの選択だけは、この回答のステートメントが実行されるときに必ずしも行われるわけではありません。これは、たとえばforeachループで、実際にidListをトラバースし始めたときに行われます。
Mark Meuer、2014

13

拡張子付きのストレートLinqを使用Distinct()

var idList = (from x in yourList select x.ID).Distinct();

3
        int[] numbers = {1,2,3,4,5,3,6,4,7,8,9,1,0 };
        var nonRepeats = (from n in numbers select n).Distinct();


        foreach (var d in nonRepeats)
        {

            Response.Write(d);
        }

出力

1234567890


1
質問に回答しません。回答しても、新しいことは何も追加されません。
nawfal 2013年

2

Distinctを取得するときは、IEnumerableにもキャストする必要があります。リストがモデルの意味である場合、このようなコードを記述する必要があります

 IEnumerable<T> ids = list.Select(x => x).Distinct();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.