我写了这个:
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
方法不能按预期在比较器内部工作?
答案 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