我有一个强类型的自定义对象列表MyObject,它具有属性Id以及其他一些属性。 假设一个MyObject的Id将其定义为唯一的,并且我想检查我的集合是否已经有一个ID为1的MyObject对象,然后再将我的新MyObject添加到集合中。 我想要使用if(!List.Contains(myObj)),但我该如何强制实现只有一个或两个MyObject属性将其定义为唯一的事实? 我可以使用IComparable? 或者我只需要重写一个Equals方法,但是我需要先继承一些东西吧?
谢谢
I have a strongly typed list of custom objects, MyObject, which has a property Id along with some other properties. Let's say that the Id of a MyObject defines it as unique and I want to check if my collection doesn't already have a MyObject object that has an Id of 1 before I add my new MyObject to the collection. I want to use if(!List.Contains(myObj)) but how do I enforce the fact that only one or two properties of MyObject define it as unique? I can use IComparable? Or do I only have to override an Equals method but I'd need to inherit something first is that right?
Thanks
最满意答案
List<T>.Contains使用EqualityComparer<T>.Default , IEquatable<T>继而使用IEquatable<T>如果类型实现它),否则使用IEquatable<T> 。
你可以实现IEquatable<T>但如果你这样做,重写IEquatable<T>是一个好主意,如果你这样做,重写GetHashCode()是一个很好的主意:
public class SomeIDdClass : IEquatable<SomeIDdClass> { private readonly int _id; public SomeIDdClass(int id) { _id = id; } public int Id { get { return _id; } } public bool Equals(SomeIDdClass other) { return null != other && _id == other._id; } public override bool Equals(object obj) { return Equals(obj as SomeIDdClass); } public override int GetHashCode() { return _id; } }请注意,哈希码与平等标准相关。 这是至关重要的。
这也使其适用于任何其他情况,其中由具有相同ID定义的相等性是有用的。 如果你有一个检查列表是否有这样一个对象的要求,那么我可能会建议你做:
return someList.Any(item => item.Id == cmpItem.Id);List<T>.Contains uses EqualityComparer<T>.Default, which in turn uses IEquatable<T> if the type implements it, or object.Equals otherwise.
You could just implement IEquatable<T> but it's a good idea to override object.Equals if you do so, and a very good idea to override GetHashCode() if you do that:
public class SomeIDdClass : IEquatable<SomeIDdClass> { private readonly int _id; public SomeIDdClass(int id) { _id = id; } public int Id { get { return _id; } } public bool Equals(SomeIDdClass other) { return null != other && _id == other._id; } public override bool Equals(object obj) { return Equals(obj as SomeIDdClass); } public override int GetHashCode() { return _id; } }Note that the hash code relates to the criteria for equality. This is vital.
This also makes it applicable for any other case where equality, as defined by having the same ID, is useful. If you have a one-of requirement to check if a list has such an object, then I'd probably suggest just doing:
return someList.Any(item => item.Id == cmpItem.Id);更多推荐
发布评论