【问题标题】:Ignoring case in Dictionary keys忽略字典键中的大小写
【发布时间】:2012-09-11 06:43:02
【问题描述】:

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

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

【问题讨论】:

  • 您的代码按预期工作,找到"E" 的值
  • 代码的输出是什么?
  • 在我的机器上它不起作用,没有找到密钥。我有文化问题吗?但是 OrdinalIgnoreCase 不是忽略环境文化副作用的正确配置。我的操作系统是 US_eng,但所有文化设置都是巴西葡萄牙语。
  • @Cuong Le:关于您的编辑,我有理由对 Dictionary() 的返回类型进行原型设计,而不是使用 var,这是我在需要时从特定上下文中删除的 sn-p。但是好的,它可以让样本很小,以便在此处查看。

标签: c# .net dictionary


【解决方案1】:

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

【讨论】:

  • 不要忘记在 GetHashCode() 中总是返回 obj 的 ToLowerInvariant 否则它将不起作用!
【解决方案2】:

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

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

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

【讨论】:

  • 大概您使用的是 Visual Studio 2012?
  • @HaemEternal:是的! VS2012,为什么?
  • 我试图用 VS2010/.NET 4.0 重现您的问题;但无法这样做。
【解决方案3】:

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

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

【讨论】:

  • 是的,但它们对我不起作用。我认为 OrdinalIgnoreCase 应该是忽略我所有环境文化设置的正确配置。不是吗?
  • 试试 InvariantCultureIgnoreCase 或 CurrentCultureIgnoreCase。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多