gpt4 book ai didi

c# - 通用字典的不区分大小写的访问

转载 作者:IT王子 更新时间:2023-10-29 03:29:33 25 4
gpt4 key购买 nike

我有一个使用托管 dll 的应用程序。其中一个 dll 返回一个通用字典:

Dictionary<string, int> MyDictionary;  

字典包含大写和小写的键。

另一方面,我得到了一个潜在键(字符串)的列表,但我不能保证这种情况。我正在尝试使用键获取字典中的值。但是,由于大小写不匹配,以下当然会失败:

bool Success = MyDictionary.TryGetValue( MyIndex, out TheValue );  

我希望 TryGetValue 会像 MSDN doc 中提到的那样有一个忽略大小写 标志,但这似乎对通用词典无效。

有没有办法在忽略关键案例的情况下获取该字典的值?有没有比使用正确的 StringComparer.OrdinalIgnoreCase 参数创建字典的新副本更好的解决方法?

最佳答案

无法指定 StringComparer在您尝试获得值(value)的地方。仔细想想,"foo".GetHashCode()"FOO".GetHashCode()完全不同,因此没有合理的方法可以在区分大小写的 HashMap 上实现不区分大小写的获取。

但是,您可以首先使用以下方法创建不区分大小写的字典:-

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

这个新词典然后使用 GetHashCode()StringComparer.OrdinalIgnoreCase 上实现所以comparer.GetHashCode("foo")comparer.GetHashcode("FOO")给你同样的值(value)。

或者,如果字典中只有几个元素,和/或您只需要查找一次或两次,则可以将原始字典视为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)。

关于c# - 通用字典的不区分大小写的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13230414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com