C# 分类集<;字符串>;林克,除了比较器的奇怪

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

我正在使用.NET4.6,我感到非常奇怪。我试图从排序集获取所有值的IEnumerable,这些值与传入的IEnumerable不区分大小写。据我所知,这是我们的工作

我有一个类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 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。我想我在某个时候读过它,或者忘记了它,或者它对系统中的其他代码或其他东西不起作用。不管怎样,非常感谢您的修复和洞察力!