我有两个数组。第一个包含所有成员,第二个包含所有声明的成员。我试图只使用except来获取无人认领的成员,但结果数组包括所有成员(第一个数组的精确副本)。
var junior_handler_All = db2.junior_handler.Include(j => j.person).Include(j => j.status).ToArray();
var junior_handler_Claimed = db.junior_handler.Include(j => j.person).Include(j => j.status).ToArray();
var junior_handler_Unclaimed = junior_handler_All.Except(junior_handler_Claimed).ToArray();
我还尝试使用具有相同结果的where查询来获取无人认领的成员。
var junior_handler_Unclaimed = junior_handler_All.Where(i => !junior_handler_Claimed.Contains(i.Junior_Handler_ID.ToString()));
为什么其中任何一个都无法运作?
答案 0 :(得分:2)
Except
和Contains
比较元素的方式是调用GetHashCode()
并且 - 如果该哈希值相等 - 调用Equals
来检查两个元素是否相等。
因此,如果您将此应用于没有自己的GetHashCode()
和Equals()
实现的引用类型,则此比较会产生一个简单的引用相等检查。
您可能不想比较对象的引用,而是某种ID。所以你有两个选择:
您可以覆盖班级中的GetHashCode()
和Equals()
:
public class Person
{
public int ID { get; set; }
public override bool Equals(object o)
{
return ID == (o as Person)?.ID;
}
public override int GetHashCode()
{
return ID;
}
}
或者像这样实现IEqualityComparer<Person>
:
public class Comparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
return x.ID == y.ID; // or whatever defines your equality
}
public int GetHashCode(Person obj)
{
return obj.ID; // or whatever makes a good hash
}
}
并向Except
提供此比较器的实例:
var junior_handler_Unclaimed =
junior_handler_All.Except(junior_handler_Claimed, new Comparer()).ToArray();
答案 1 :(得分:0)