我使用.NET 4.6并且遇到了严重的陌生感。我试图从有序集中获取所有值的IEnumerable,这些值不是IEnumerable中传递的不区分大小写的。据我所知,这是Except的工作。
我有一个类CaseInsensitiveComparer,它实现如下:
public class CaseInsensitiveComparer : IComparer<string>, IEqualityComparer<string>
{
public static CaseInsensitiveComparer Instance { get; private set; }
static CaseInsensitiveComparer()
{
Instance = new CaseInsensitiveComparer();
}
public int Compare(string a, string b)
{
var ret = string.Compare(a, b, true);
return ret;
}
public bool Equals(string a, string b)
{
return Compare(a, b) == 0;
}
public int GetHashCode(string a)
{
return a.GetHashCode();
}
}
我这样用:
public void DotNetWeirdness()
{
var a = new SortedSet<string>();
a.Add("A");
var b = a.Except(new string[] { "a" }, CaseInsensitiveComparer.Instance);
}
b的值是包含A的IEnumerable。因为我要求除了a / A以外的SortedSet中的所有值,不应该有一个空集作为结果吗?我很困惑。
谢谢!
答案 0 :(得分:2)
问题在于您没有覆盖GetHashCode
。 "A".GetHashCode()
会从"a".GetHashCode()
返回不同的值。
解决此问题的一种快捷方法是将GetHashCode
功能更改为:
public int GetHashCode(string a)
{
return a.ToLower().GetHashCode();
}
另外,你知道StringComparer
吗?您可以将代码更改为:
var b = a.Except(new string[] { "a" }, StringComparer.InvariantCultureIgnoreCase);
不必担心实施自己的比较器