将 IDictionary 键转换为小写 (C#)

本文关键字:string IDictionary 转换 | 更新日期: 2023-09-27 17:47:23

>我有一个方法,可以获取IDictionary作为参数。现在我想提供一个从这个字典中检索值的方法,但它应该是大小写不变的。

所以我现在的解决方案是有一个静态函数,它循环遍历键并将它们转换为 Lower(),如下所示:

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() 方法不区分大小写?

将 IDictionary<string、string> 键转换为小写 (C#)

是 - 传递字典构造函数StringComparer.OrdinalIgnoreCase(或其他忽略大小写的比较器,具体取决于区分区域性的需求)。

通过使用 StringDictionary,键在创建时转换为小写。

http://simiansoftware.blogspot.com/2008/11/have-const-string-with-ui-description.html

您可以使用 var 关键字来消除一些混乱。从技术上讲,来源保持不变。此外,我只会传递并返回一个字典<字符串,字符串>因为您没有对该 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 继承,只需封送对内部字典实例的调用。

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 声明:

"密钥以不区分大小写的方式处理;在与字符串字典一起使用之前,它被转换为小写。

在 .NET Framework 1.0 版中,此类使用区分区域性的字符串比较。但是,在 .NET Framework 1.1 版及更高版本中,此类在比较字符串时使用 CultureInfo.InvariantCulture。有关区域性如何影响比较和排序的详细信息,请参阅比较和排序特定区域性的数据和执行不区分区域性的字符串操作。

你也可以试试这种方式

convertedDictionatry = convertedDictionatry .ToDictionary(k => k.Key.ToLower(), k => k.Value.ToLower());

使用 IEnumerable<T> 扩展方法的 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);
        }