为什么我的词典<;字符串,字符串>;默认情况下不区分大小写

本文关键字:字符串 情况下 默认 不区 大小写 gt lt 我的 为什么 | 更新日期: 2023-09-27 18:01:11

据我所知,Dictionary中的密钥检查默认情况下是区分大小写的,但至少在我的软件中,情况并非如此。为了对TryGetValue和Contains进行区分大小写的密钥检查,我必须按照以下方式构建字典:

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

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

为什么我的词典<;字符串,字符串>;默认情况下不区分大小写

否,默认情况下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
  • 3用于检查是否找到密钥CCD_ 4和CCD_。只有前者才是
  • 然后,使用Add来添加密钥A。它没有抱怨,也就是说,它不认为密钥已经存在
  • 最后,Count用于检查字典条目的总数,并正确输出2,即Aa
通用字典构造函数IDictionary<TKey, TValue>()将使用在TKey实例上提供的bool Equals(object obj)int GetHashCode()的任何实现。

对于string,该实现在功能上等同于EqualityComparer<string>.Default所提供的实现,CCD_17是等同于StringComparer.Ordinal的功能。


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

相关文章: