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(); } } |
用途:
我在我拥有的其他机器(4个虚拟机和1个实机)中测试了它,发现只有在我当前的虚拟机(win7 x64,us_eng,一些葡萄牙语设置,.net 4.5)中才会出现问题。在我的真实机器和其他虚拟机中,该测试可以很好地工作,使用了序数对齐和不变的ignorecase。
所以,我猜在那个环境中有一些非常奇怪的东西,但我现在不能花时间去调查它。
不幸的是,这个问题被一些人认为是无用的,这使我无法深入研究它。
对于不区分大小写的字典键,字典声明是正确的。
您还可以使用