194

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

这似乎相关,但我没有正确理解:c# Dictionary: making the Key case-insensitive through declarations

4

6 回答 6

382

这似乎相关,但我没有正确理解:c# Dictionary: making the Key case-insensitive through declarations

确实有关系。解决方案是告诉字典实例不要使用标准的字符串比较方法(区分大小写),而是使用不区分大小写的方法。这是使用适当的构造函数完成的:

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

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

StringComparer.InvariantCultureIgnoreCase给你一个IEqualityComparer实例,它以不区分大小写的方式比较字符串。

于 2012-12-21T11:04:46.813 回答
25
var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");

if (myDic.ContainsKey("hello"))
    Console.WriteLine(myDic["hello"]);
于 2012-12-21T11:07:48.857 回答
16

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

YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
于 2016-11-17T19:59:16.670 回答
11

如果您无法控制实例创建,假设您的对象已从 json 等中去除,您可以创建一个继承自字典类的包装类。

public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
    public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
于 2020-07-14T22:14:14.027 回答
2

我刚刚遇到了同样的麻烦,我需要在 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!");
于 2019-10-22T08:08:28.503 回答
0

我知道这是一个较老的问题,但我遇到了同样的问题,即字典来自第 3 方工具,该工具未在构造函数中实现忽略大小写 StringComparer。从@Soviut 上面的方法进行了调整,但感觉这更干净,让您可以立即使用该值。

var lookup = source.FirstOrDefault(x => x.Key.Equals("...", StringComparison.OrdinalIgnoreCase));
if (lookup.Key != null)
于 2021-10-11T15:46:38.047 回答