Tôi cần phải băm với biến thành viên thay vì lớp, vì vậy tôi không kiểm tra xem tham chiếu có trong từ điển hay không. Không ghi đè các giá trị mặc định, nó sẽ không tìm thấy Value
giống hệt nhau, nhưng chỉ trả về nếu nó tìm thấy cùng một ví dụ chính xác là HashedType
, chẳng hạn như mã này không thành công.Lợi thế của việc tạo ra lớp bên ngoài từ IEqualityComparer <> override GetHashCode và Equals
Dictionary.Add(new HashedType(4));
Dictionary.Contains(new HashedType(4)); // fails to find 4
Định nghĩa của HashedType:
HashedType
{
public HashedType(Int32 value) { Value = value); }
public HashedType(String value) { Value = value); }
public object Value;
public void Serialize(Serializer s)
{
if (Value.GetType() == typeof(Int32))
{
s.Set<Int32>(0);
s.Set<Int32>(Value);
}
else
{
s.Set<Int32>(1);
s.Set<String>(Value);
}
}
}
Dường như tôi có thể ghi đè GetHashCode() và Equals() để thực hiện điều này cho tôi.
Tuy nhiên, MSDN khuyên tôi nên tạo một lớp riêng biệt mà tôi lấy được từ IEqualityComparer và khởi tạo từ điển của tôi đã sử dụng HashedType với HashedTypeComparer: IEqualityComparer.
Để giúp dễ dàng hơn này, tôi đã bắt nguồn từ điển và tạo
HashedTypeDictionary<U> : Dictionary<T,U>
{
public HashedTypeDictionary() : base(new HashedTypeComparer()) { }
public bool Equals(HashedType a, HashedType b) { return a.Value == b.Value; }
publci int GetHashCode(HashedType a) { return a.Value.GetHashCode(); }
}
này tất cả dường như contrived.
Lợi thế duy nhất tôi nhận được không thay đổi bằng()?
Ý tôi là, thực sự nói, tôi cũng muốn Bằng so sánh với thành viên đó.