Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于检查字符串数组中唯一性的哈希代码_C#_.net_Linq_Hashcode_Gethashcode - Fatal编程技术网

C# 用于检查字符串数组中唯一性的哈希代码

C# 用于检查字符串数组中唯一性的哈希代码,c#,.net,linq,hashcode,gethashcode,C#,.net,Linq,Hashcode,Gethashcode,我将大量的数据数组存储到一个列表中,但是,如果数据已经存在于我的列表中,我不想存储数据-数据的顺序无关紧要。我认为使用GetHashCode生成hashcode是合适的,因为它应该不关心顺序。然而,我在下面的一个简单测试中发现,对于前两个字符串[]a1和a2,它会生成不同的哈希代码 我可以不使用这种检查方法吗?有人能建议一个更好的检查方法吗 string[] a1 = { "cat", "bird", "dog" }; string[] a2 = { "cat",

我将大量的数据数组存储到一个列表中,但是,如果数据已经存在于我的列表中,我不想存储数据-数据的顺序无关紧要。我认为使用GetHashCode生成hashcode是合适的,因为它应该不关心顺序。然而,我在下面的一个简单测试中发现,对于前两个字符串[]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());
上述测试的结果产生三种不同的hashcode结果


理想情况下,我希望看到a1和a2使用相同的哈希代码……因此,我正在寻找一种可以让我快速检查这些字符串是否已经存在的方法。

根据数组用于确定相等性的标准,您的数组不相等。数组用于确定相等性的标准是,两个单独创建的数组永远不相等

如果希望单独创建的具有相等元素的集合进行相等比较,请使用支持该类型的集合类型

对于您的情况,我建议使用
HashSet
。它不提供您直接想要的
GetHashCode()
Equals()
行为,但它有一个方法,为您提供一个帮助器类,该类为您提供哈希代码和比较器方法,这些方法可以做您想要的事情

请记住,您不能将此用于快速平等性检查。您只能将其用于快速的不平等性检查。两个不相等的对象可能仍然具有相同的哈希代码,基本上是随机的。只有当散列码不相等时,才可以跳过相等检查。

如果您说a1。(),这将:


使用字典或HashMap您不能在此处使用
GetHashCode
,因为1<数组上的code>GetHashCode并不关心元素的顺序。2.
GetHashCode
只查看数组的最后8个元素。Mitch-Dod搜索,显然没有解决方案。Sten-你能详细解释一下字典/哈希映射是什么意思吗?我不确定一个键/值对如何解决我的难题。我很确定数组的
GetHashCode()
实现实际上不会以任何方式检查内容。因此,对不同但内容等效的数组的引用将产生不同的哈希代码。@MarcinJuraszek您是指
int IStructuralEquatable.GetHashCode(IEqualityComparer comparer comparer)
方法吗?这是一个显式的接口方法实现(它还有一个参数),它不会在
数组
变量上调用<代码>数组
不重写
对象。GetHashCode()
。它使用
对象
实现,第一次在实例上调用它时返回一个伪随机数。它甚至不一定是随机的。只要求相等的对象产生相同的哈希代码,所有返回相同哈希代码的特定类型的对象在技术上都满足这一要求。@TheInnerLight是的,这是另一种选择,尽管这是一个非常糟糕的实现(除非该类型的所有对象实际上都被认为是相等的,在这种情况下,您的评论不适用)我建议避免使用任何具有该属性的类,因为它可能也会有更严重的错误。:)哦,是的,这太可怕了,我绝对不推荐这种行为。我的评论绝对不是对那种写作课的认可。这只是概述了最糟糕的情况。@hvd对于CreateSetComparer()类,我是必须重载并编写自己的条件,还是自动执行比较?寻找一个快速简单的解决方案here@Reza
CreateSetComparer()
是一个方法,而不是类。它确实使用一个类,但您不能直接访问该类。你不仅不需要重载或重写任何东西,也没有任何方法来重载或重写任何东西。
using System;

public class Program
{
    public static void Main()
    {
        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());
    }
}