List.Contains无法正常工作
-
23-10-2019 - |
题
如果我有类型的对象 MyBull
和 List<MyBull> orig
:
// Just an example
MyBull x = getMeTheObjectWithIdFromDB(9);
orig.add(x);
// Again same? data object
MyBull y = getMeTheObjectWithIdFromDB(9);
为什么这是错误的?
// This is false, even though all the properties
// of x and y are the same.
orig.Contains<MyBull>(y);
解决方案
默认情况下,对象将公开基于参考的平等。如果您需要自定义规则,例如基于ID字段的平等,则需要覆盖 Equals
和 GetHashCode
方法。
其他提示
如果您可以使用Linq,那么您可以
class Vessel
{
public int id { get; set; }
public string name { get; set; }
}
...
var vessels = new List<Vessel>() { new Vessel() { id = 4711, name = "Millennium Falcon" } };
var ship = new Vessel { id = 4711, name = "Millencolin" };
if (vessels.Any(vessel => vessel.id == ship.id))
Console.Write("There can be only one!");
这是因为正在通过参考比较Mybull实例。从.net,x和y的角度来看 不同的实例 因此不等。
为了解决这个问题,您必须 覆盖平等和Gethashcode方法 (这意味着您可能应该实施 IEquatable<MyBull>
并覆盖==和!=运算符)。
您的mybull对象实现了吗 IEquatable<T>.Equals
?此方法将确定两个对象的平等性
由OP要求
您的Mybull课程将实现Iquable
public class MyBull : IEquatable<MyBull>
然后您需要覆盖 Equals
方法
public bool Equals(MyBull theOtherMyBull)
正如David Neale在下面提到的那样,当您比较同一类型的对象时,最好使用它。覆盖对象。equals and object.gethashcode也将起作用。
不隶属于 StackOverflow