C#中字符串键类型的不区分大小写字典

时间:2012-12-21 10:46:07

标签: c# collections generic-collections

如果我有Dictionary<String,...>,是否可以制作ContainsKey不区分大小写的方法?

这看起来很相关,但我没有理解它:c# Dictionary: making the Key case-insensitive through declarations

5 个答案:

答案 0 :(得分:254)

  

这似乎有关,但我没有理解它:c#Dictionary:通过声明使Key不区分大小写

确实有关系。解决方案是告诉字典实例不要使用标准字符串比较方法(区分大小写),而是使用不区分大小写的方法。这是使用appropriate constructor

完成的
var dict = new Dictionary<string, YourClass>(
        StringComparer.InvariantCultureIgnoreCase);

构造函数需要一个IEqualityComparer来告诉字典如何比较键。

StringComparer.InvariantCultureIgnoreCase为您提供了一个IEqualityComparer实例,它以不区分大小写的方式比较字符串。

答案 1 :(得分:17)

var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");

if (myDic.ContainsKey("hello"))
    Console.WriteLine(myDic["hello"]);

答案 2 :(得分:9)

您从第三方或外部dll中提取字典的机会很少。使用linq

<强> YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))

答案 3 :(得分:6)

如果您无法控制实例的创建,可以说您的对象是从json等中删除的,则可以创建一个从字典类继承的包装器类。

public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
    public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}

答案 4 :(得分:0)

在ASP.NET Core控制器中需要区分大小写的字典时,我遇到了同样的麻烦。

我写了一个扩展方法来解决问题。 也许这对其他人也有帮助...

public static IDictionary<string, TValue> ConvertToCaseInSensitive<TValue>(this IDictionary<string, TValue> dictionary)
{
    var resultDictionary = new Dictionary<string, TValue>(StringComparer.InvariantCultureIgnoreCase);
    foreach (var (key, value) in dictionary)
    {
        resultDictionary.Add(key, value);
    }

    dictionary = resultDictionary;
    return dictionary;
}

使用扩展方法:

myDictionary.ConvertToCaseInSensitive();

然后使用以下命令从字典中获取一个值:

myDictionary.ContainsKey("TheKeyWhichIsNotCaseSensitiveAnymore!");
相关问题