Collection.Contains()用于检查现有对象的内容是什么?

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)


Rob*_*cus 6

您可以使用LINQ轻松完成此操作.

var result = MyCollection.Any(p=>p.myId == Id);
if(result)
{
     //something
}
Run Code Online (Sandbox Code Playgroud)

  • 不仅更简洁,而且必须遍历整个集合.在第一场比赛中,"任何"都会缩短. (8认同)
  • 稍微简洁一点:MyCollection.Any(x => x.myId == Id) (5认同)
  • 我要把它全部戴在帽子上. (5认同)