为什么我的Dictionary <string,string =“”>默认情况下不区分大小写?</string,>

时间:2014-05-01 08:56:35

标签: c# dictionary case-sensitive

我的理解是,默认情况下,词典中的键检查区分大小写,但至少在我的软件中看来并非如此。为了获得TryGetValue和Contains的大小写敏感键检查,我必须按如下方式构建我的词典:

Dictionary<string, string> a = new Dictionary<string,string>(StringComparer.Ordinal);

我错了吗?字典是否默认情况下不区分大小写?

2 个答案:

答案 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用于检查是否找到了密钥aA。只有前者才是。
  • 然后,Add用于添加密钥A。它没有抱怨,即它不认为密钥已经存在。
  • 最后,Count用于检查字典条目的总数,并正确输出2,即Aa

答案 1 :(得分:2)

通用字典构造函数IDictionary<TKey, TValue>()将使用在TKey的实例上提供bool Equals(object obj)int GetHashCode()的任何实现。

对于string,此实现与EqualityComparer<string>.Default提供的功能等效,功能相当于StringComparer.Ordinal


正如您在问题中所述,您可以使用字典构造函数的替代重载来提供将用作替代的IEqualityComparer<string>实现。