@driis answer뿐만 아니라, 당신은 또한 같은 새로운 IEqualityComparer<Product>
만들 수 있습니다
public sealed class ProductEqualityComparer : IEqualityComparer<Product>
{
public bool Equals(Product x, Product y)
{
if (ReferenceEquals(x, y)) return true;
if (ReferenceEquals(x, null)) return false;
if (ReferenceEquals(y, null)) return false;
if (x.GetType() != y.GetType()) return false;
return x.idProduct == y.idProduct;
}
public int GetHashCode(Product obj)
{
return obj.idProduct;
}
}
을 그리고 당신이 통과 할 수 Comparer
-Contains
같은 : list1
이 List<Product>
으로 정의된다
if (list1.Contains(product, new ProductEqualityComparer()))
{
}
:
Product product = new Product { idProduct = 1 };
List<Product> list1 = new List<Product>
{
new Product{idProduct = 1},
new Product{idProduct = 2}
};
우리는 당신이
IEqualityComparer<T>
인터페이스를 구현하는 대신
EqualityComparer<T>
클래스 에서 파생하는 것이 좋습니다
MSDN states
때문에
또는 당신은 Equals
및 GetHashCode
를 오버라이드 (override) 다음 EqualityComparer<T>
에서 상속 할 수 있습니다, 평등에 대한 때문에 EqualityComparer<T>
클래스를 테스트를 사용하여IEquatable<T>.Equals
메서드 대신 Object.Equals 메서드를 사용하십시오. Dictionary<TKey, TValue>
클래스 및 기타 컬렉션의 Contains, IndexOf, LastIndexOf 및 Remove 메서드와 일치합니다.
public sealed class ProductEqualityComparer : EqualityComparer<Product>
{
public override bool Equals(Product x, Product y)
{
if (ReferenceEquals(x, y)) return true;
if (ReferenceEquals(x, null)) return false;
if (ReferenceEquals(y, null)) return false;
if (x.GetType() != y.GetType()) return false;
return x.idProduct == y.idProduct;
}
public override int GetHashCode(Product obj)
{
return obj.idProduct;
}
}
+1. 대부분의 Linq/콜렉션 메소드는 비교자를 인수로 사용하므로 커스텀'Equal'을 구현하는 것은 꼭 필요한 것은 아닙니다. –
@AlexeiLevenkov 그게 무슨 소리 야? –
@HamletHakobyan [Enumerable.Contains (..., IEqualityComparer)] (http://msdn.microsoft.com/en-us/library/vstudio/bb339118%28v=vs.100%29.aspx) –