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

标签 c# .net linq hashcode gethashcode

我正在将大量数据数组存储到一个列表中,但是,如果数据已经存在于我的列表中,我不想存储它——数据的顺序无关紧要。我认为使用 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 具有相同的哈希码...所以我正在寻找可以让我快速检查这些字符串是否已经存在的东西。

最佳答案

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

如果您希望单独创建的具有相同元素的集合进行比较,那么请使用支持它的集合类型。

我推荐HashSet<T> ,在你的情况下 HashSet<string> .它不提供 GetHashCode()Equals()你直接想要的行为,但它有一个 CreateSetComparer() 方法为您提供一个帮助器类,该类确实为您提供散列码和比较器方法来执行您想要的操作。

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

关于c# - 用于检查字符串数组中唯一性的哈希码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33661540/

相关文章:

c# - 尝试编写像 Unity 这样的最小行为系统时,循环似乎会阻塞

c# - 为什么只读字段检查不能在循环之外进行优化?

c# - 在 Petrel 插件中使用 DefaultCredentials

c# - 通过 TCP 接收数据 : MemoryStream contains more data than expected

c# - 当前文化不存在 list

c# - LINQ:无法将类型 'System.Int32' 转换为类型 'System.Object'

c# - 使用 lambda 聚合匿名类型

MySQL LINQ to SQL 提供程序 Visual Studio 2012

C# LINQ 获取字段值与字符串数组黑名单不匹配的对象

c# - 如何返回两个日期之间的周末日期列表