使用できますExcept
。ただし、カスタム タイプがある場合は、Linq で適切に機能するよう にオーバーライドする必要がEquals()
あります。GetHashCode()
これは、Linq が効率を追求しているためです。そのためHashSet<T>
、他のメカニズムを使用して、アイテムが同等かどうかをすばやく判断できます (同等のアイテムには同じハッシュ コードが必要であるか、ハッシュ コードが正しくない)。したがって、 を実装するだけでは十分ではなく、カスタム クラスでこのタイプのメソッドを使用する場合にEquals()
も実装する必要があります。GetHashCode()
例えば:
public class tobj : IEquatable<tobj>
{
public string column1;
public string column2;
public bool Equals(tobj other)
{
return other != null ? Equals(column1, other.column1) && Equals(column2, other.column2) : false;
}
public override bool Equals(object obj)
{
return Equals(obj as tobj);
}
public override int GetHashCode()
{
// seed the code
int hash = 13;
// use some primes to mix in the field hash codes...
hash = hash * 17 + column1.GetHashCode();
hash = hash * 17 + column2.GetHashCode();
return hash
}
}
GetHashCode() と Equals() をオーバーライドしたので (私IEquatable<T>
自身も実装するのが好きです)、以下を使用できますExcept()
。
var results = array1.Except(array2);
foreach (var i in results)
{
Console.WriteLine(i.column1 + ":" + i.column2);
}
良いものを実装するためのヒントについては、ハッシュコードのアルゴリズムに関するこの SO スレッドを参照することをお勧めします。
また、補足として、一部の型 ( KeyValuePair
、Tuple
、および匿名型など)は、個々のコンポーネントを考慮に入れる方法で等価性を既に実装Equals()
し、正しく実装しています。GetHashCode()