C# 分类集<;字符串>;林克,除了比较器的奇怪
我正在使用.NET4.6,我感到非常奇怪。我试图从排序集获取所有值的IEnumerable,这些值与传入的IEnumerable不区分大小写。据我所知,这是我们的工作 我有一个类CaseInsensitiveComparer,它是这样实现的:C# 分类集<;字符串>;林克,除了比较器的奇怪,c#,linq,sortedset,.net-4.6,C#,Linq,Sortedset,.net 4.6,我正在使用.NET4.6,我感到非常奇怪。我试图从排序集获取所有值的IEnumerable,这些值与传入的IEnumerable不区分大小写。据我所知,这是我们的工作 我有一个类CaseInsensitiveComparer,它是这样实现的: public class CaseInsensitiveComparer : IComparer<string>, IEqualityComparer<string> { public static CaseInsensit
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 class CaseInsensitiveComparer:IComparer、iQualityComparer
{
公共静态CaseInsensitiveComparer实例{get;private set;}
静态不区分大小写比较程序()
{
Instance=new caseinsensitiviecomparer();
}
公共整数比较(字符串a、字符串b)
{
var ret=string.Compare(a,b,true);
返回ret;
}
公共布尔等于(字符串a、字符串b)
{
返回比较(a,b)==0;
}
public int GetHashCode(字符串a)
{
返回a.GetHashCode();
}
}
我是这样使用它的:
public void DotNetWeirdness()
{
var a = new SortedSet<string>();
a.Add("A");
var b = a.Except(new string[] { "a" }, CaseInsensitiveComparer.Instance);
}
public void DotNetWeirdness()
{
var a=新分拣数据集();
a、 添加(“a”);
var b=a.Except(新字符串[]{“a”},CaseInsensitiveComparer.Instance);
}
b的值是一个包含A的IEnumerable。既然我要求SortedSet中除了A/A以外的所有值,那么我的结果不应该是一个空集吗?我对此感到很困惑
谢谢 问题是您没有覆盖
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);
而且不必担心实现自己的比较器您没有编写
GetHashCode
来返回a
和a
的相同值。这恰好修复了它。另外,非常感谢您的StringComparer。我想我在某个时候读过它,或者忘记了它,或者它对系统中的其他代码或其他东西不起作用。不管怎样,非常感谢您的修复和洞察力!