【发布时间】:2015-11-11 23:07:00
【问题描述】:
我将大量数据数组存储到一个列表中,但是,如果数据已经存在于我的列表中,我不想存储它——数据的顺序无关紧要。我认为使用 GetHashCode 生成哈希码是合适的,因为它应该不关心顺序。但是,我通过下面的简单测试发现,对于前两个 string[] a1 和 a2 它会生成不同的哈希码。
我可以不使用这种检查方法吗?有人可以建议更好的检查方法吗?
string[] a1 = { "cat", "bird", "dog" };
string[] a2 = { "cat", "dog", "bird" };
string[] a3 = { "cat", "fish", "dog" };
Console.WriteLine(a1.GetHashCode());
Console.WriteLine(a2.GetHashCode());
Console.WriteLine(a3.GetHashCode());
上述测试的结果产生了三种不同的哈希码结果。
理想情况下,我希望看到 a1 和 a2 的 Hashcode 相同...所以我正在寻找可以让我快速检查这些字符串是否已经存在的东西。
【问题讨论】:
-
使用字典
或 HashMap -
你不能在这里使用
GetHashCode,因为 1.GetHashCode在数组上确实关心元素的顺序。 2.GetHashCode只查看数组的最后8个元素。 -
Mitch - 进行了搜索,显然没有解决方案。 Sten - 您能否详细说明字典/哈希图的含义...不确定键/值对将如何解决我的困境
-
我很确定数组对
GetHashCode()的实现实际上并没有以任何方式检查内容。因此,对不同但内容等效的数组的引用将产生不同的 HashCode。 -
@MarcinJuraszek 你的意思是
int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)方法吗?它是一个显式接口方法实现(它也有一个参数),它不会在Array变量上调用。Array不会覆盖object.GetHashCode()。它使用object实现,第一次在实例上调用它时返回一个伪随机数。
标签: c# .net linq hashcode gethashcode