ICollection<MyType>
とという型の 2 つのコレクションがc1
ありc2
ます。c2
にあるが にないアイテムのセットを見つけたいと思いますc1
。ここで、等しいことを示すヒューリスティックは のId
プロパティMyType
です。
C# (3.0) でこれを実行する最も簡単な方法は何ですか?
ICollection<MyType>
とという型の 2 つのコレクションがc1
ありc2
ます。c2
にあるが にないアイテムのセットを見つけたいと思いますc1
。ここで、等しいことを示すヒューリスティックは のId
プロパティMyType
です。
C# (3.0) でこれを実行する最も簡単な方法は何ですか?
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();
}
}
C# 3.0 + Linq を使用している場合:
var complement = from i2 in c2
where c1.FirstOrDefault(i1 => i2.Id == i1.Id) == null
select i2;
補数をループして項目を取得します。
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());
ジェネリックと述語を使用してそれを行うこともできます。サンプルが必要な場合は、お知らせください。