转换IDictionary< string,string>键小写(C#)
-
03-07-2019 - |
题
我有一个将IDictionary作为参数的方法。 现在我想提供一个从这个字典中检索值的方法,但它应该是case-invariant。
所以我现在的解决方案是让一个静态函数循环遍历键并将它们转换为下面这样的:( / p>
private static IDictionary<ILanguage, IDictionary<string, string>> ConvertKeysToLowerCase(
IDictionary<ILanguage, IDictionary<string, string>> dictionaries)
{
IDictionary<ILanguage, IDictionary<string, string>> resultingConvertedDictionaries
= new Dictionary<ILanguage, IDictionary<string, string>>();
foreach(ILanguage keyLanguage in dictionaries.Keys)
{
IDictionary<string, string> convertedDictionatry = new Dictionary<string, string>();
foreach(string key in dictionaries[keyLanguage].Keys)
{
convertedDictionatry.Add(key.ToLower(), dictionaries[keyLanguage][key]);
}
resultingConvertedDictionaries.Add(keyLanguage, convertedDictionatry);
}
return resultingConvertedDictionaries;
}
现在,这没关系,但仍然是一大堆代码与我的“干净和高效”的想法相矛盾。你知道任何替代方法,以便字典的.ContainsKey()方法不区分套管吗?
解决方案
是 - 传递Dictionary构造函数 StringComparer.OrdinalIgnoreCase
(或另一个忽略大小写的比较器,具体取决于您的文化敏感度需求)。
乔恩
其他提示
通过使用StringDictionary,键在创建时转换为小写。
http://simiansoftware.blogspot .COM / 2008/11 /有const的字符串与 - UI-description.html
您可以使用 var 关键字删除一些混乱。从技术上讲,来源保持不变。我也只是传递并返回一个字典&lt; string,string&gt;因为你没有对ILanguage参数做任何事情并使该方法更可重用:
private static IDictionary<string, string> ConvertKeysToLowerCase(
IDictionary<string, string> dictionaries)
{
var convertedDictionatry = new Dictionary<string, string>();
foreach(string key in dictionaries.Keys)
{
convertedDictionatry.Add(key.ToLower(), dictionaries[key]);
}
return convertedDictionatry;
}
......并且这样称呼它:
// myLanguageDictionaries is of type IDictionary<ILanguage, IDictionary<string, string>>
foreach (var dictionary in myLanguageDictionaries.Keys)
{
myLanguageDictionaries[dictionary].Value =
ConvertKeysToLowerCase(myLanguageDictionaries[dictionary].Value);
}
您可以自己继承IDictionary,并简单地封送内部Dictionary实例的调用。
Add(string key, string value) { dictionary.Add(key.ToLowerInvariant(), value) ; }
public string this[string key]
{
get { return dictionary[key.ToLowerInvariant()]; }
set { dictionary[key.ToLowerInvariant()] = value; }
}
// And so forth.
System.Collections.Specialized.StringDictionary()可能会有所帮助。 MSDN声明:
&quot;密钥以不区分大小写的方式处理;它在与字典字典一起使用之前被翻译成小写。
在.NET Framework 1.0版中,此类使用区分文化的字符串比较。但是,在.NET Framework 1.1及更高版本中,此类在比较字符串时使用CultureInfo.InvariantCulture。有关文化如何影响比较和排序的更多信息,请参阅比较和排序特定文化的数据并执行不区分文化的字符串操作。“
使用 IEnumerable&lt; T&gt;
扩展方法的LINQ版本:
private static IDictionary<ILanguage, IDictionary<string, string>> ConvertKeysToLowerCase(
IDictionary<ILanguage, IDictionary<string, string>> dictionaries)
{
return dictionaries.ToDictionary(
x => x.Key, v => CloneWithComparer(v.Value, StringComparer.OrdinalIgnoreCase));
}
static IDictionary<K, V> CloneWithComparer<K,V>(IDictionary<K, V> original, IEqualityComparer<K> comparer)
{
return original.ToDictionary(x => x.Key, x => x.Value, comparer);
}