276

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

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、result は最初の出現のみを取得する必要があります。

4

4 に答える 4

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

編集:これIEnumerable<>を に入れるList<>ことは多くの人にとって謎のように思われるので、単純に次のように書くことができます:

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

IEnumerableしかし、上記の Linq が遅延評価されるよりも、 を使用した方がよい場合がよくありIListます。列挙型が反復されるまで、実際にはすべての作業を行うわけではありません。あなたが呼び出すToListと、実際には列挙可能な全体を歩き回り、すべての作業を前もって行うように強制します。(列挙型が無限に長い場合は、少し時間がかかる場合があります。)

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

于 2013-10-16T14:36:48.027 に答える
130

morelinqを使用すると、以下を使用できますDistinctBy

myList.DistinctBy(x => x.id);

それ以外の場合は、グループを使用できます。

myList.GroupBy(x => x.id)
      .Select(g => g.First());
于 2013-10-16T14:35:54.083 に答える
62

この場合、ID を比較するには、オーバーライドEqualsして意味のあるものにする必要があります。GetHashCode

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

    public override bool Equals(object obj)
    {
        LinqTest obj2 = obj as LinqTest;
        if (obj2 == null) return false;
        return id == obj2.id;
    }

    public override int GetHashCode()
    {
        return id;
    }
}

今、あなたは使用することができますDistinct:

List<LinqTest> uniqueIDs = myList.Distinct().ToList();
于 2013-10-16T14:40:35.797 に答える
29
myList.GroupBy(i => i.id).Select(group => group.First())
于 2013-10-16T14:36:43.103 に答える