您可以使用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()
正确地实现了等价性,它们考虑到了它们的各个组件。