我已经实现了一些版本的元组类,并且真的想从中学到更多.
能不能指出我在实施过程中遗漏的一些问题.
class My_tuple<T1, T2> : EqualityComparer<My_tuple<T1, T2>>
{
#region Virables
public T1 First { get; private set; }
public T2 Second { get; private set; }
#endregion
#region Constractors
public My_tuple(T1 first, T2 second)
{
First = first;
Second = second;
}
#endregion
#region Equals && GetHashCode
public override bool Equals(My_tuple<T1, T2> L, My_tuple<T1, T2> R)
{
return EqualityComparer<T1>.Default.Equals(L.First, R.First) && EqualityComparer<T2>.Default.Equals(L.Second , R.Second);
}
public override bool Equals(object obj)
{
return obj is My_tuple<T1, T2> && Equals(this, (My_tuple<T1, T2>)obj);
}
public override int GetHashCode(My_tuple<T1, T2> M)
{
return M.First.GetHashCode() ^ M.Second.GetHashCode();
}
#endregion
#region operators
public static bool operator ==(My_tuple<T1, T2> left, My_tuple<T1, T2> right)
{
return left.Equals(right);
}
public static bool operator !=(My_tuple<T1, T2> left, My_tuple<T1, T2> right)
{
return !(left == right);
}
public static My_tuple<T1, T2> Create<T1, T2>(T1 first, T2 second)
{
return new My_tuple<T1, T2>(first, second);
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
Jon*_*eet 13
一些东西:
EqualityComparer<T>- 你应该实施IEqualityComparer<T>.GetHashCode()是不理想的; 这意味着对于具有相同类型的左右(例如My_tuple<int, int>)值相等的任何元组,您将获得相同的哈希码0.即(1,1)具有与(2,2)相同的哈希码我更喜欢"添加和乘法"实现 - 在这种情况下你可以返回(比方说)17 * hash1+ 31 * hash2.仍然会有碰撞,但希望不会那么多.Equals(L, R)假设L和R非空Create方法是通用的,尝试重新声明T1和T2类型参数.我很惊讶,甚至编译,虽然这是我以前没有尝试过的东西.考虑在非泛型类中创建静态泛型方法(例如,只是My_tuple)以允许类型推断工作,例如My_tuple.Create(1, "hello")创建一个My_tuple<int, string>| 归档时间: |
|
| 查看次数: |
2810 次 |
| 最近记录: |