ICollection <T>.Contains на пользовательских типах

Если я имею (ссылка - она имеет значение?) вводят MyType, который не переопределяет, Равняется методу, что эвристика будет использоваться при определении, содержит ли ICollection <MyType> приведенный пример типа?

Что лучший способ состоит в том, чтобы использовать мою собственную эвристику (например, проверка на равенство идентификационного значения свойства)?

9
задан Ben 27 January 2010 в 00:42
поделиться

4 ответа

Так как ваш тип не переопределяет Equals, то будет использована реализация по умолчанию Equals, т.е. ссылочное равенство. Таким образом, значения Contains будут истинны, если коллекция содержит именно этот экземпляр .

Чтобы использовать собственное сравнение, реализуйте IEqualityComparer (например, для сравнения Ids) и передайте экземпляр вашего сравнителя в метод Contains. (Это предполагает, что вы можете использовать расширения LINQ, так как "родной" ICollection.Contains метод не имеет перегрузки IEqualityComparer)

.
8
ответ дан 4 December 2019 в 21:49
поделиться

Это не определено ICOLLIONCE - разные реализации могут использовать разные методы. Из MSDN :

Реализации могут варьироваться в том, как они определить равенство объектов; для Пример, Список использует Comparer .default , тогда как словарь позволяет пользователю указывать Imparer Реализация для использования для сравнения Ключи

В большинстве случаев он просто сравнивает ссылки, но вы должны проверить документацию для конкретного iconglection , которые вы используете.

1
ответ дан 4 December 2019 в 21:49
поделиться

AFAIK, ссылка (адрес в памяти) будет сравниваться ...

Если ссылка не достаточно хороша для вас, тогда вы можете сравнить идентификатор, как Вы упомянули.

0
ответ дан 4 December 2019 в 21:49
поделиться

В соответствии с MSDN:

Воплощения могут различаться в зависимости от того, каким образом они определять равенство объектов; ибо пример, List<(Of <(T>)>) использует Сравнение<(из <(T>)>)...::.Default, в то время как словарь <(Of <(TKey, TValue>)>) позволяет пользователю указывать IComparer<(Of <(T>)>) внедрение для использования с целью сравнения Ключи.

Лучший способ сделать это самостоятельно - это использовать перегрузку, которая принимает IEqualityComparer

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
ответ дан 4 December 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: