关于c#:忽略Dictionary键中的大小写

Ignoring case in Dictionary keys

如何忽略字典键中的大小写?我这样做:

1
2
3
4
5
6
7
var map = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
map.Add("e","Letter e lower case");

string value = null;
if (!map.TryGetValue("E", out value)) {
    Console.WriteLine("Not found");
}

我已经尝试使用StringComparer.InvariantIgnoreCase,结果是一样的。它找不到大写字母"e"。

编辑:即使使用OrdinalIgnoreCase,我的环境设置是否会与某种文化冲突?


StringComparer.OrdinalIgnoreCase在System.Globalization.textinfo中使用对Window API"NativeCompareOrdinalIgnoreCase"函数的内部调用,因此它不是不变的区域性。mscorlib.dll中的函数是内部函数,这太糟糕了,我们无法测试它。

无论如何,您应该使用StringComparer.InvariantCultureIgnoreCase而不是前者。

如果它仍然不起作用,您可以重新实现IEqualityComparer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class StringComparerIgnoreCase : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        if (x != null && y != null)
        {
            return x.ToLowerInvariant() == y.ToLowerInvariant();
        }
        return false;
    }

    public int GetHashCode(string obj)
    {
        return obj.GetHashCode();
    }
}

用途:

1
var map = new Dictionary<string, string>(new StringComparerIgnoreCase());


我在我拥有的其他机器(4个虚拟机和1个实机)中测试了它,发现只有在我当前的虚拟机(win7 x64,us_eng,一些葡萄牙语设置,.net 4.5)中才会出现问题。在我的真实机器和其他虚拟机中,该测试可以很好地工作,使用了序数对齐和不变的ignorecase。

所以,我猜在那个环境中有一些非常奇怪的东西,但我现在不能花时间去调查它。

不幸的是,这个问题被一些人认为是无用的,这使我无法深入研究它。


对于不区分大小写的字典键,字典声明是正确的。

您还可以使用map.ContainsKey("E")map["E"]来搜索和访问密钥。