我的理解是,默认情况下,词典中的键检查区分大小写,但至少在我的软件中看来并非如此。为了获得TryGetValue和Contains的大小写敏感键检查,我必须按如下方式构建我的词典:
Dictionary<string, string> a = new Dictionary<string,string>(StringComparer.Ordinal);
我错了吗?字典是否默认情况下不区分大小写?
答案 0 :(得分:6)
不,Dictionary<string, string>
默认情况下不区分大小写。
这可以通过这个小应用程序轻松显示:
using System;
using System.Collections.Generic;
public class MainClass
{
public static void Main(string[] args)
{
var newDict = new Dictionary<string, string>();
newDict.Add("a", "x");
Console.WriteLine(newDict.ContainsKey("a"));
Console.WriteLine(newDict.ContainsKey("A"));
newDict.Add("A", "y");
Console.WriteLine(newDict.ContainsKey("a"));
Console.WriteLine(newDict.ContainsKey("A"));
Console.WriteLine(newDict.Count);
}
}
输出:
True
False
True
True
2
说明:
a
。ContainsKey
用于检查是否找到了密钥a
和A
。只有前者才是。Add
用于添加密钥A
。它没有抱怨,即它不认为密钥已经存在。Count
用于检查字典条目的总数,并正确输出2
,即A
和a
。答案 1 :(得分:2)
通用字典构造函数IDictionary<TKey, TValue>()
将使用在TKey
的实例上提供bool Equals(object obj)
和int GetHashCode()
的任何实现。
对于string
,此实现与EqualityComparer<string>.Default
提供的功能等效,功能相当于StringComparer.Ordinal
。
正如您在问题中所述,您可以使用字典构造函数的替代重载来提供将用作替代的IEqualityComparer<string>
实现。