忽略字典键中的大小写

Luc*_*ano 8 .net c# dictionary

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

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");
}
Run Code Online (Sandbox Code Playgroud)

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

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

Hiệ*_* Lê 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var map = new Dictionary<string, string>(new StringComparerIgnoreCase());
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记在 GetHashCode() 中始终返回 obj 的 ToLowerInvariant,否则它将不起作用! (4认同)

Luc*_*ano 4

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

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

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