9

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

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 ,我是否会与我的环境设置存在某种文化冲突?

4

3 回答 3

5

StringComparer.OrdinalIgnoreCase 在 System.Globalization.TextInfo 中使用对 Window API“nativeCompareOrdinalIgnoreCase”函数的内部调用;所以它不是不变的文化。太糟糕了 mscorlib.dll 中的函数是内部的,我们无法测试它。

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

如果它仍然拒绝工作,您可以重新实现 IEqualityComparer

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();
    }
}

用法:

var map = new Dictionary<string, string>(new StringComparerIgnoreCase());
于 2013-12-27T17:22:09.840 回答
4

我在我拥有的其他机器(4 个虚拟机和 1 个真实的)上对其进行了测试,发现只有在我当前的虚拟机(Win7 x64、us_eng、一些葡萄牙语设置、.net 4.5)中才会出现问题。在我的真实机器和其他虚拟机中,测试工作正常,使用 OrdinalIgnoreCase 以及 InvariantIgnoreCase。

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

不幸的是,这个问题被一些人标记为无用,这让我失去了深入研究它的兴趣。

于 2012-09-20T21:02:48.573 回答
0

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

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

于 2012-09-18T23:33:34.763 回答