为什么相交方法无法按预期工作?

时间:2019-04-30 09:51:58

标签: c# .net linq

我写了这个:

public class AnagramEqualityComparer: IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        var t = x.Intersect(y).Count();
        return t == x.Length;
    }

    public int GetHashCode(string obj)
    {
        return obj.GetHashCode();
    }
}

我想在列表中找到Anagrams单词,所以我像这样使用上面的IEqualityComparer

List<string> inputList = new List<string>() { "eat", "tea", "tan", "ate", "nat", "bat" };
var result =  inputList.GroupBy(w => w, new AnagramEqualityComparer());

结果应该是三组,但似乎它将返回6组,每组包含一个项目。那么有人知道吗,为什么我的Intersect方法不能按预期在比较器内部工作?

1 个答案:

答案 0 :(得分:1)

问题不是String urlto = "https://docs.google.com/gview?embedded=true&url=" + url; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlto)); startActivity(intent); 调用。比较两个带有Intersect的对象时,将首先对它们进行散列并比较散列,并且只有它们相等时才调用IEqualityComparer

字符串的Equals是基于字符串中的字符及其顺序的,因此,字谜可以(并且可能)具有不同的哈希码。相反,您应该具有一个与字符顺序无关的哈希码。您可以对字符串中的字符进行排序,然后对其进行哈希处理,但这会使计算变得如此缓慢(相对),从而使哈希处理变得无效。一个简单的想法可能是使用字符串的长度:

GetHashCode