top*_*wik 48 c# collections contains
我有一个强类型的自定义对象列表MyObject,它有一个属性Id和一些其他属性.
假设MyObject的Id将其定义为唯一,我想在将新的MyObject添加到集合之前检查我的集合是否还没有Id为1的MyObject对象.
我想使用if(!List.Contains(myObj))但是如何强制只有MyObject的一个或两个属性将其定义为唯一的这一事实?
我可以用IComparable吗?或者我只需要覆盖Equals方法,但我需要首先继承一些东西吗?
谢谢
Jon*_*nna 49
List<T>.Contains
使用EqualityComparer<T>.Default
,IEquatable<T>
如果类型实现它,则使用,object.Equals
否则.
你可以实现,IEquatable<T>
但object.Equals
如果你这样做是一个好主意,如果你这样做,一个非常好的主意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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,哈希码与相等标准相关.这很重要.
这也使其适用于任何其他情况,其中由具有相同ID定义的相等是有用的.如果您有一个要求来检查列表是否有这样的对象,那么我可能会建议:
return someList.Any(item => item.Id == cmpItem.Id);
Run Code Online (Sandbox Code Playgroud)
Lee*_*Lee 28
List<T>
使用由EqualityComparer<T>.Default
和根据文档返回的比较器:
Default属性检查类型T是否实现System.IEquatable(Of T)接口,如果是,则返回使用该实现的EqualityComparer(Of T).否则,它返回一个EqualityComparer(Of T),它使用由T提供的Object.Equals和Object.GetHashCode的覆盖.
因此,您可以IEquatable<T>
在自定义类上实现,也可以覆盖Equals
(和GetHashCode
)方法以通过所需的属性进行比较.或者你可以使用linq:
bool contains = list.Any(i => i.Id == obj.Id);
Run Code Online (Sandbox Code Playgroud)
您可以使用LINQ轻松完成此操作.
var result = MyCollection.Any(p=>p.myId == Id);
if(result)
{
//something
}
Run Code Online (Sandbox Code Playgroud)