Có một số địa điểm ở BCL nơi có thể sử dụng IEqualityComparer. Giống như Enumerable.Contains hoặc Dictionary Constructor. Tôi có thể cung cấp bộ so sánh nếu tôi không hài lòng với số default.Có loại "ReferenceComparer" nào trong .NET không?
Đôi khi tôi muốn biết liệu bộ sưu tập có chứa mà đối tượng rất mà tôi có tham chiếu đến không. Không phải cái được coi là "bình đẳng" theo bất kỳ nghĩa nào khác.
Câu hỏi đặt ra là: liệu có tồn tại sự so sánh bình đẳng tiêu chuẩn trong BCL chỉ dựa trên phương pháp ReferenceEquals không?
Một trong đó tôi đã viết bản thân mình là thế này:
class ReferenceComparer<T> : IEqualityComparer<T> where T : class
{
private static ReferenceComparer<T> m_instance;
public static ReferenceComparer<T> Instance
{
get
{
return m_instance ?? (m_instance = new ReferenceComparer<T>());
}
}
public bool Equals(T x, T y)
{
return ReferenceEquals(x, y);
}
public int GetHashCode(T obj)
{
return RuntimeHelpers.GetHashCode(obj);
}
}
tôi không kiểm tra nó kỹ lưỡng cũng không coi nhiều kịch bản, nhưng có vẻ như để làm cho Enumerable.Contains
và Dictionary
khá hạnh phúc.
Thật không may là tất cả các bộ sưu tập này được viết theo cách Java-esque, yêu cầu bạn viết một lớp thực hiện một giao diện cụ thể. Nếu chỉ họ cho phép bạn vượt qua trong một đại biểu để xác định toán tử so sánh, bạn có thể truyền trực tiếp 'object.ReferenceEquals'. Tôi đoán đó là bởi vì hai phương pháp là cần thiết (so sánh và hashcode). –
Vì tôi hiểu nó, mặc dù, đối tác Java với 'IEqualityComparer' không có' GetHashCode', vì vậy nó * có thể * được thực hiện như một đại biểu trong Java nếu các đại biểu được hỗ trợ Java. – Gabe
@Ben xem câu trả lời của orip: http: // stackoverflow.com/questions/98033/wrap-a-delegate-in-an-iequalitycomparer/1239337 # 1239337 –