用于检查字符串数组

时间:2015-11-11 23:07:01

标签: c# .net linq hashcode gethashcode

我将大量数据存储到List中,但是,如果数据已经存在于我的列表中,我不想存储数据 - 数据的顺序无关紧要。我认为使用GetHashCode生成哈希码是合适的,因为假设不关心顺序。但是,我在下面的简单测试中发现,对于前两个字符串[] 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 ...所以我正在寻找能让我快速检查这些字符串是否已经存在的东西。

2 个答案:

答案 0 :(得分:3)

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

如果您想要将具有相同元素的单独创建的集合比较为相等,则使用支持该集合的集合类型。

我推荐HashSet<T> HashSet<string>。它不直接提供您想要的GetHashCode()Equals()行为,但它有一个CreateSetComparer()方法,为您提供 为您提供的帮助类执行您想要的哈希码和比较器方法。

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

答案 1 :(得分:0)

如果你说a1。GetHashCode(),这将是always generate a new hash code for you

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());
    }
}