我有一个使用托管 dll 的应用程序。其中一个 dll 返回一个通用字典:
Dictionary<string, int> MyDictionary;
字典包含大写和小写的键。
另一方面,我得到了一个潜在键(字符串)的列表,但我不能保证这种情况。我正在尝试使用键获取字典中的值。但是,当然以下内容会失败,因为我的大小写不匹配:
bool Success = MyDictionary.TryGetValue( MyIndex, out TheValue );
我希望 TryGetValue 会有一个忽略大小写标志,就像 MSDN 文档中提到的那样,但这似乎对通用词典无效。
有没有办法获取忽略关键大小写的字典的值?
有没有比使用正确的 StringComparer.OrdinalIgnoreCase 参数创建字典的新副本更好的解决方法?
无法在尝试获取值时指定 a。如果您考虑一下,并且完全不同,那么没有合理的方法可以在区分大小写的哈希映射上实现不区分大小写的获取。StringComparer
"foo".GetHashCode()
"FOO".GetHashCode()
但是,您可以首先使用以下方法创建不区分大小写的字典:-
var comparer = StringComparer.OrdinalIgnoreCase;
var caseInsensitiveDictionary = new Dictionary<string, int>(comparer);
或者使用现有区分大小写的字典的内容创建一个新的不区分大小写的字典(如果您确定没有大小写冲突):-
var oldDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var newDictionary = new Dictionary<string, int>(oldDictionary, comparer);
然后,这个新字典使用 so 上的实现并为您提供相同的值。GetHashCode()
StringComparer.OrdinalIgnoreCase
comparer.GetHashCode("foo")
comparer.GetHashcode("FOO")
或者,如果字典中只有几个元素,和/或您只需要查找一两次,您可以将原始字典视为一个并迭代它:-IEnumerable<KeyValuePair<TKey, TValue>>
var myKey = ...;
var myDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var value = myDictionary.FirstOrDefault(x => String.Equals(x.Key, myKey, comparer)).Value;
或者,如果您愿意,没有 LINQ:-
var myKey = ...;
var myDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
int? value;
foreach (var element in myDictionary)
{
if (String.Equals(element.Key, myKey, comparer))
{
value = element.Value;
break;
}
}
这为您节省了创建新数据结构的成本,但作为回报,查找的成本是 O(n) 而不是 O(1)。
对于从不使用常规字典构造函数的 LINQ 用户
myCollection.ToDictionary(x => x.PartNumber, x => x.PartDescription, StringComparer.OrdinalIgnoreCase)
有更简单的方法:
using System;
using System.Collections.Generic;
....
var caseInsensitiveDictionary = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
模板简介:该模板名称为【C# 不区分大小写的泛型字典访问】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。