Если я имею (ссылка - она имеет значение?) вводят MyType, который не переопределяет, Равняется методу, что эвристика будет использоваться при определении, содержит ли ICollection <MyType> приведенный пример типа?
Что лучший способ состоит в том, чтобы использовать мою собственную эвристику (например, проверка на равенство идентификационного значения свойства)?
Так как ваш тип не переопределяет Equals, то будет использована реализация по умолчанию Equals, т.е. ссылочное равенство. Таким образом, значения Contains будут истинны, если коллекция содержит именно этот экземпляр .
Чтобы использовать собственное сравнение, реализуйте IEqualityComparer
(например, для сравнения Ids) и передайте экземпляр вашего сравнителя в метод Contains. (Это предполагает, что вы можете использовать расширения LINQ, так как "родной" ICollection
метод не имеет перегрузки IEqualityComparer)
Это не определено ICOLLIONCE
- разные реализации могут использовать разные методы. Из MSDN :
Реализации могут варьироваться в том, как они определить равенство объектов; для Пример,
Список
используетComparer
, тогда как.default словарь
позволяет пользователю указыватьImparer
Реализация для использования для сравнения Ключи
В большинстве случаев он просто сравнивает ссылки, но вы должны проверить документацию для конкретного iconglection
, которые вы используете.
AFAIK, ссылка (адрес в памяти) будет сравниваться ...
Если ссылка не достаточно хороша для вас, тогда вы можете сравнить идентификатор, как Вы упомянули.
В соответствии с 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();
}
}