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,我的环境设置是否会出现某种文化冲突?
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)
我在我拥有的其他机器(4 个虚拟机和 1 个真实机器)上进行了测试,发现只有在我当前的虚拟机(Win7 x64、us_eng、一些葡萄牙语设置、.net 4.5)中才会出现问题。在我的真实机器和其他虚拟机中,测试工作正常,使用 OrdinalIgnoreCase 以及 InvariantIgnoreCase。
所以,我猜想那个环境中有一些非常奇怪的东西,但我现在不能花时间去调查它。
不幸的是,这个问题被一些人标记为无用,这削弱了我深入研究它的兴趣。
| 归档时间: |
|
| 查看次数: |
10656 次 |
| 最近记录: |