27

ICollection<MyType>とという型の 2 つのコレクションがc1ありc2ます。c2にあるが にないアイテムのセットを見つけたいと思いますc1。ここで、等しいことを示すヒューリスティックは のIdプロパティMyTypeです。

C# (3.0) でこれを実行する最も簡単な方法は何ですか?

4

3 に答える 3

39

Enumerable.Except具体的には、次を受け入れるオーバーロードを使用しIEqualityComparer<MyType>ます。

var complement = c2.Except(c1, new MyTypeEqualityComparer());

これによりセットの違いが生じるため、結果の重複は1 回しc2か表示されないことに注意してくださいIEnumerable<MyType>IEqualityComparer<MyType>ここでは、次のように実装する必要があります

class MyTypeEqualityComparer : IEqualityComparer<MyType> {
    public bool Equals(MyType x, MyType y) {
        return x.Id.Equals(y.Id);
    }

    public int GetHashCode(MyType obj) {
        return obj.Id.GetHashCode();
    }
}
于 2010-02-03T17:13:15.660 に答える
3

C# 3.0 + Linq を使用している場合:

var complement = from i2 in c2
                 where c1.FirstOrDefault(i1 => i2.Id == i1.Id) == null
                 select i2;

補数をループして項目を取得します。

于 2010-02-03T17:15:50.253 に答える
0
public class MyTypeComparer : IEqualityComparer<MyType>
{
    public MyTypeComparer()
    {    
    }

    #region IComparer<MyType> Members

    public bool Equals(MyType x, MyType y)
    {
        return string.Equals(x.Id, y.Id);
    }

    public int GetHashCode(MyType obj)
    {
        return base.GetHashCode();
    }

    #endregion     
}

次に、Linq を使用します。

c3 collection = new collection().add(c1);
c3.add(c2);
var items = c3.Distinct(new MyTypeComparer());

ジェネリックと述語を使用してそれを行うこともできます。サンプルが必要な場合は、お知らせください。

于 2010-02-03T17:16:55.120 に答える