Case-INsensitive Dictionary with string key-type in C#
如果我有一个Dictionary,有没有可能使像ContainsKey这样的方法不区分大小写?
这似乎有关联,但我没有正确理解:C字典:通过声明使密钥不区分大小写
- 使用StringComparer.InvariantCultureIgnoreCase有什么问题?它照它说的做…
- 我从来没听说过,所以有个问题!
- 通用字典的不区分大小写访问可能重复
- 这个问题是有关联的,但并不是这个问题的翻版。那个人了解如何处理现有的词典。我从新代码开始,所以这里的答案更适合。
This seemed related, but I didn't understand it properly: c# Dictionary: making the Key case-insensitive through declarations
它确实是相关的。解决方案是告诉字典实例不要使用标准的字符串比较方法(区分大小写),而是使用不区分大小写的方法。这是使用适当的构造函数完成的:
1 2
| var dict = new Dictionary <string, YourClass >(
StringComparer .InvariantCultureIgnoreCase); |
构造函数需要一个IEqualityComparer,它告诉字典如何比较键。
StringComparer.InvariantCultureIgnoreCase提供了一个IEqualityComparer实例,它以不区分大小写的方式比较字符串。
- 完美的是,我不知怎么地错过了将比较器传递给ctor的STL样的方法。
- 它总是让我惊讶,我总是能在这里找到任何编码问题的答案!也许我会以你的名字命名下一只猫,康拉德!-)
- 可能,StringComparison.ordinalIgnoreCase比较器比基于区域性的更快:stackoverflow.com/questions/492799/&hellip;
- 如果我不是在创建字典,而是在作为对象一部分获取的现有字典上尝试使用containsKey()进行不区分大小写的键匹配,我该怎么做?
- @你根本不能(有效地)这么做。比较逻辑是内部字典数据结构的核心部分。为了实现这一点,容器必须为其数据维护多个索引,而字典则不这样做。
1 2 3 4 5
| var myDic = new Dictionary <string, string>(StringComparer .InvariantCultureIgnoreCase);
myDic .Add("HeLlo", "hi");
if (myDic .ContainsKey("hello"))
Console .WriteLine(myDic ["hello"]); |
- 代码片段说明了一切。非常有帮助。不知道为什么这篇文章比公认的答案晚了3分钟,有这么少的赞成票。
很少有机会处理从第三方或外部dll中提取的字典。使用LINQ
YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
- 这很管用。不过,请注意,如果您将Any更改为SingleOrDefault,则如果不存在null,您将不会得到返回,相反,您将得到一个keyValuePair,其中key和value都设置为null!
- Contains似乎是一个非常具体的用例,适用于您当时正在研究的内容。作为一个更通用的有用答案,我认为Equals更好。在同样的注释中,使用StringComparison.xxxCase比使用ToLower()复制字符串更好。
- 这是非常有用的,去掉tolower肯定是一个改进——我的用例是:返回appliedbuffs.any(b=>b.key.equals(name,stringcomparison.ordinalIgnoreCase));在区分大小写的字典中包含完全不区分大小写的内容。