ICollection.Contains on custom types

后端 未结 4 789
旧时难觅i
旧时难觅i 2021-01-12 02:19

If I have a (reference - does it matter?) type MyType which does not override the Equals method, what heuristics will be used when determining if an IC

相关标签:
4条回答
  • 2021-01-12 03:00

    It's not defined by ICollection<T>- different implementations can use different methods. From MSDN:

    Implementations can vary in how they determine equality of objects; for example, List<T> uses Comparer<T>.Default, whereas Dictionary<TKey, TValue> allows the user to specify the IComparer<T> implementation to use for comparing keys

    In most cases it will just compare the references, but you should check the documentation for the specific ICollection<T> you are using.

    0 讨论(0)
  • 2021-01-12 03:06

    Because your type doesn't override Equals, the default implementation of Equals will be used, i.e. reference equality. So Contains will be true if the collection contains that very instance.

    To use your own comparison, implement IEqualityComparer<T> (e.g. to compare the Ids) and pass an instance of your comparer into the Contains method. (This assumes you are able to use LINQ extensions, as the "native" ICollection<T>.Contains method doesn't have the IEqualityComparer overload.)

    0 讨论(0)
  • 2021-01-12 03:07

    AFAIK, the reference (address in memory) will be compared...

    If the reference is not good enough for you then you might compare the ID, as you've mentioned.

    0 讨论(0)
  • 2021-01-12 03:07

    According to MSDN:

    Implementations can vary in how they determine equality of objects; for example, List<(Of <(T>)>) uses Comparer<(Of <(T>)>)..::.Default, whereas Dictionary<(Of <(TKey, TValue>)>) allows the user to specify the IComparer<(Of <(T>)>) implementation to use for comparing keys.

    The best way to do it on your own is to use the overload that takes an IEqualityComparer<T>

    public class MyComparer : IEqualityComparer<MyType>
    {
        public bool Equals(MyType x, MyType y)
        {
            return x.Id == y.Id;
        }
    
        public int GetHashCode(MyType obj)
        {
            return obj.Id.GetHashCode();
        }
    }
    
    0 讨论(0)
提交回复
热议问题