SortedSet <string> Linq。除了具有Comparer陌生感

时间:2015-09-07 03:11:48

标签: c# linq sortedset .net-4.6

我使用.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中的所有值,不应该有一个空集作为结果吗?我很困惑。

谢谢!

1 个答案:

答案 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);

不必担心实施自己的比较器