【发布时间】:2018-08-14 03:04:33
【问题描述】:
我正在使用 unity,而 unity 中没有元组,所以我创建了自己的元组类来工作,因为我的字典需要它。
Dictionary <Tuple<int,int>, Tile>
我创建的 Tile 类与解决这个问题并不真正相关(至少我认为它不会有帮助)。
但问题是我在元组中同时使用了负整数和正整数,当我将当前的GetHashCode() 与Tuples 一起使用时,有时我会得到相同的HashCode,例如Tuple<-10, 8> 和@当我返回哈希码时,987654325@ 都给出 -172。
有什么好的 GetHashCode 不会让我发生冲突吗?
老实说,我只使用运算符==,因为我需要检查两个元组内部是否有相同的整数,如果我能得到一个运算符==,它只会在两个整数相同并且在同样的顺序,它会解决我的问题。
其他一些小问题,我无法理解 Equals 覆盖,因为它正在工作,但我不知道它的工作情况如何,因为我改变了每一件事,直到它工作。
public class Tuple<T1, T2>
{
public T1 First { get; private set; }
public T2 Second { get; private set; }
public Tuple(T1 _First, T2 _Second)
{
First = _First;
Second = _Second;
}
public override int GetHashCode()
{
int hash = 0;
hash = First.GetHashCode() * 17 + Second.GetHashCode() + First.GetHashCode();
return hash;
}
public static bool operator==(Tuple<T1, T2> obj1, Tuple<T1, T2> obj2)
{
if (ReferenceEquals(null, obj2))
return false;
return (obj1.GetHashCode() == obj2.GetHashCode());
}
public static bool operator!=(Tuple<T1, T2> obj1, Tuple<T1, T2> obj2)
{
if (ReferenceEquals(null, obj2))
return true;
return !(obj1.GetHashCode() == obj2.GetHashCode());
}
public bool Equals(Tuple<T1, T2> other)
{
if (other == null)
return false;
if (GetHashCode() == other.GetHashCode())
return true;
else
return false;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
{
return false;
}
if (ReferenceEquals(this, obj))
{
return true;
}
Tuple<T1, T2> other = obj as Tuple<T1, T2>;
return obj.GetType() == GetType() && Equals(other);
}
}
public static class Tuple
{
public static Tuple<T1, T2> New<T1, T2>(T1 first, T2 second)
{
var tuple = new Tuple<T1, T2>(first, second);
return tuple;
}
}
【问题讨论】:
标签: c# unity3d overriding hashcode gethashcode