- ICollection에 <합니다 MyType > 여부를 결정하는 경우, 어떤 추론이 사용됩니다 (참조? 그것은 중요 않음) 가 Equals 메서드 오버라이드 (override)하지 않는 합니다 MyType을 입력에는 유형의 지정된 인스턴스가 포함되어 있습니까?ICollection에 <T> .Contains는
내 자신의 경험적 방법 (예 : 속성 값의 동일성 확인)을 사용하는 가장 좋은 방법은 무엇입니까?
- ICollection에 <합니다 MyType > 여부를 결정하는 경우, 어떤 추론이 사용됩니다 (참조? 그것은 중요 않음) 가 Equals 메서드 오버라이드 (override)하지 않는 합니다 MyType을 입력에는 유형의 지정된 인스턴스가 포함되어 있습니까?ICollection에 <T> .Contains는
내 자신의 경험적 방법 (예 : 속성 값의 동일성 확인)을 사용하는 가장 좋은 방법은 무엇입니까?
유형이 Equals를 재정의하지 않으므로 참조 평등이라는 기본 구현 인 Equals가 사용됩니다. 컬렉션에 이 포함되어 있고 그 인스턴스가 인 경우 Contains가 true가됩니다.
자신 만의 비교를 사용하려면 IEqualityComparer<T>
(예 : ID 비교)을 구현하고 비교 자 인스턴스를 Contains 메소드에 전달하십시오. "기본"ICollection<T>.Contains
메서드에 IEqualityComparer 오버로드가 없으므로 LINQ 확장을 사용할 수 있다고 가정합니다.
다른 구현에서는 다른 방법을 사용할 수 있습니다. MSDN :
구현 방법은 개체 평등을 결정하는 방법에 따라 달라질 수 있습니다. 예를 들어,
List<T>
는Comparer<T>.Default
이Dictionary<TKey, TValue>
반면 사용자가 그냥 참조를 비교합니다 대부분의 경우 키
을 비교하기 위해 사용하는 에게 IComparer<T>
구현을 지정할 수 있습니다 사용하지만 설명서를 확인해야합니다 특정 ICollection<T>
을 사용하고 있습니다. 참조가 당신이 언급 한대로 다음, ID를 비교할 수있는 충분하지 않은 경우
AFAIK, (메모리 주소)의 기준은
... 비교됩니다.
MSDN에 따르면
가 개체의 평등을 결정 방법에 변화 할 수있다구현; 예를 들어, 목록 <에 대한 (< (T는>)> 중) 사전 < (반면에 .. ::. 기본 (< (T>)>의) 비교 자 <, 를 사용 < (TKEY의, TValue>)>)는 사용자가 키를 비교하는 데 사용할 IComparer < (Of < (>>)>) 구현을 지정할 수있게합니다.
자신에 그것을 할 수있는 가장 좋은 방법은 당신이 사용하는 어떤 구체적인 수집 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();
}
}
걸리는 과부하를 사용하는 것입니다? –
System.Collections.ObjectModel.Collection –
Ben