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

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

这似乎是相关的,但我没有正确地理解它:c#字典:通过声明使键不区分大小写

86261 次浏览

这似乎是相关的,但我没有正确地理解:c#字典:通过声明使键不区分大小写

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

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

我遇到了同样的麻烦,在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!");

如果你在实例创建中没有控制权,比如你的对象是从json等中去消毒的,你可以创建一个从字典类继承的包装类。

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

我知道这是一个老问题,但我有同样的问题,字典来自第三方工具,没有实现构造函数中的忽略大小写StringComparer。调整从方法@Soviut上面有,但感觉这是很多干净,让你工作的值立即。

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