이 IEqualityComparer<T>
구현은 override
GetHashCode
및 Equals
의 기본 구현을하지 않습니다.
IEqualityComparer<T>
을 구현하면 구현 자 인스턴스를 T
의 동등 비교 자로 제공 할 수 있습니다. 이것은 여러 linq 확장 및 일반 컬렉션 생성자에 공통적 인 매개 변수입니다.
Equals
및 GetHashCode
을 대체하면 클래스 인스턴스의 평등성이 테스트됩니다. 대체 IEqualityComparer<T>
을 제공하지 않는 =
및 !=
연산자 및 linq 확장과 일반 콜렉션 생성자와 같은 Equals
및 GetHashCode
을 호출하는 다른 임 플리 멘 테이션을 활용하십시오.
이러한 개념은 비슷하지만 은 다른 용도로 사용되지만 부분적으로 바꿀 수는 없습니다.
public class A
{
public string Value1 { get; set; }
public int Value2 { get; set; }
public override int GetHashCode()
{
unchecked
{
int hash = 17;
hash = (hash * 23) +
StringComparer.Ordinal.GetHashCode(this.Value1);
hash = (hash * 23) + this.Value2;
return hash;
}
}
public override bool Equals(object obj)
{
var a = obj as A;
if (a == null)
{
return false;
}
if (a.Value2 != this.Value2)
{
return false;
}
return StringComparer.Ordinal.Equals(
a.Value1,
this.Value1);
}
}
A
의이 구현이 제대로
Equals
및
GetHashCode
우선
,이 변화는 LINQ 확장을 호출 한 후 다음을 보장하기에 충분하다, 내가 예와 확장하자
var distinct = aSequneceOfA.Distinct();
distinct
에는 모두 동일한 Value2
을 가진 인스턴스가 포함되지 않습니다. 일반적으로는 Value1
입니다. 이것을 달성하기 위해 다른 인터페이스 구현이 필요하지 않습니다.
자, 아마도 내가 어떤 소문자 구분을 필요로, 어떤 상황에서 내가 Value1
이 서수 비교와 행복하지 않았다 것으로 가정합니다. 새로운 평등 비교자를 구현할 수도 있습니다.이 날 Distinct
의 다른 오버로드를 호출 할 수 것
public class AComparerInsensitive : IEqualityComparer<A>
{
public bool Equals(A x, A y)
{
if (x == null)
{
return y == null;
}
if (y == null)
{
return false;
}
if (x.Value2 != y.Value2)
{
return false;
}
return StringComparer.CurrentCultureIgnoreCase.Equals(
x.Value1,
y.Value1)
}
public int GetHashCode(A a)
{
if (a == null)
{
return 0;
}
unchecked
{
int hash = 17;
hash = (hash * 23) +
StringComparer.CurrentCultureIgnoreCase.GetHashCode(
a.Value1);
hash = (hash * 23) + a.Value2;
return hash;
}
}
}
,
var insensitivelyDistinct = aSequneceOfA.Distinct(
new AComparerInsensitive());
A
들 Equals
및 GetHashCode
을 무시하고 비교를 수행 할 AComparerInsensitive
를 사용하여 별개의 ingnores이 과부하.
문제를 설명하는 코드를 게시 할 수 있습니까? 맞 춥니 다. –