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;
}
}
Обратите внимание, что хеш-код относится к критериям равенства. Это жизненно важно.
Это также делает его применимым к любому другому случаю, когда полезно равенство, определяемое тем же идентификатором. Если у вас есть одно требование, чтобы проверить, есть ли в списке такой объект, то я бы, вероятно, предложил просто сделать:
return someList.Any(item => item.Id == cmpItem.Id);