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

本文关键字:字符串 类型 字典 大小写 不区 | 更新日期: 2023-09-27 17:49:14

如果我有一个Dictionary<String,...>是可能使方法像ContainsKey大小写不敏感?

c# Dictionary:通过声明

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

使Key不区分大小写

这似乎是相关的,但我没有正确理解它:c# Dictionary:通过声明

使Key不区分大小写

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

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

构造函数期望一个IEqualityComparer,它告诉字典如何比较键。

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

var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");
if (myDic.ContainsKey("hello"))
    Console.WriteLine(myDic["hello"]);

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

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

如果你在实例创建中没有控制权,比如你的对象从json中被反灭菌,你可以创建一个继承字典类的包装器类。

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

我刚刚遇到了同样的麻烦,在ASP中需要一个大小写不敏感的字典。. NET核心控制器。

我写了一个扩展方法来完成这个任务。也许这对其他人也有帮助。

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!");

我知道这是一个较老的问题,但我有同样的问题,其中字典来自第三方工具,没有在构造函数中实现忽略大小写StringComparer。对@Soviut上面的方法进行了调整,但感觉这样更简洁,可以让您立即处理值。

var lookup = source.FirstOrDefault(x => x.Key.Equals("...", StringComparison.OrdinalIgnoreCase));
if (lookup.Key != null)