C# 为什么Intersect方法不能按预期工作?

C# 为什么Intersect方法不能按预期工作?,c#,.net,linq,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)

我写过这样的话:

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

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

问题不是
Intersect
调用。使用
IEqualityComparer
比较两个对象时,首先对它们进行散列,然后比较散列,并且仅当它们相等时才会调用
Equals

字符串的
GetHashCode
基于其中的字符及其顺序,因此字谜可能(也可能)具有不同的哈希代码。相反,您应该有一个与字符顺序无关的哈希代码。您可以对字符串中的字符进行排序,然后对其进行散列,但这会使计算速度非常慢(相对而言),从而否定散列的意义。一个简单的想法是使用字符串的长度:

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.Length;
    }
}
公共类AnagramEqualityComparer:IEqualityComparer
{
公共布尔等于(字符串x、字符串y)
{
var t=x.Intersect(y.Count();
返回t==x.长度;
}
public int GetHashCode(字符串obj)
{
返回对象长度;
}
}
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.Length;
    }
}