C# 忽略字典键中的大小写

C# 忽略字典键中的大小写,c#,.net,dictionary,C#,.net,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"); } var-map=新

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

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");
}
var-map=新字典(StringComparer.OrdinalIgnoreCase);
地图。添加(“e”,“字母e小写”);
字符串值=null;
如果(!map.TryGetValue(“E”,输出值)){
控制台。写入线(“未找到”);
}
我已经尝试过使用StringComparer.InvariantIgnoreCase,结果是一样的。它找不到大写字母“E”

编辑:
即使使用OrdinalingOreCase,我的环境设置也可能存在某种文化冲突吗?

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


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

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

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


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

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

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

如果它仍然拒绝工作,您可以重新实现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();
    }
}
公共类StringCompareIgnoreCase:IEqualityComparer
{
公共布尔等于(字符串x、字符串y)
{
如果(x!=null&&y!=null)
{
返回x.ToLowerInvariant()==y.ToLowerInvariant();
}
返回false;
}
public int GetHashCode(字符串obj)
{
返回obj.GetHashCode();
}
}
用法:

var map = new Dictionary<string, string>(new StringComparerIgnoreCase());
var-map=newdictionary(newstringcomparerignorecase());

您的代码对我来说工作正常,找到了
“E”的值。代码的输出是什么?在我的机器中,它不工作,找不到钥匙。我有文化问题吗?但OrdinalIgnoreCase并不是忽略环境文化副作用的正确配置。我的操作系统是US_eng,但所有区域性设置都是巴西葡萄牙语。@Cuong Le:关于您的编辑,我有理由对返回的Dictionary()类型进行原型化,而不是使用var,这是我在需要时从特定上下文中删除的代码片段。但好的,它可以留下小样本在这里查看。可能重复的是,但他们不适合我。我认为OrdinalingOrecase应该是正确的配置,可以忽略我的所有环境区域性设置。不是吗?试试不变式CultureInogoreCase或CurrentCultureInogoreCase。你可能正在使用Visual Studio 2012?@HaemEternal:是的!VS2012,为什么?我试图用VS2010/.NET 4.0重现您的问题;但无法执行此操作。请不要忘记在GetHashCode()中始终返回obj的ToLowerInvariant,否则它将不起作用!