6

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

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

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

4

7 回答 7

35

是的 - 传递 Dictionary 构造函数StringComparer.OrdinalIgnoreCase(或另一个忽略大小写的比较器,具体取决于您的文化敏感性需求)。

于 2008-10-02T09:54:23.853 回答
2

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

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

于 2009-02-09T14:50:20.090 回答
1

您可以使用var关键字来消除一些混乱。从技术上讲,来源保持不变。此外,我将传递并返回 Dictionary<string, string> 因为您没有对该 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);
}
于 2008-10-02T10:07:03.573 回答
1

您可以自己从 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.
于 2008-10-02T11:51:17.193 回答
1

System.Collections.Specialized.StringDictionary() 可能会有所帮助。MSDN 状态:

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

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

于 2008-10-16T03:03:37.360 回答
0

你也可以试试这个方法

convertedDictionatry = convertedDictionatry .ToDictionary(k => k.Key.ToLower(), k => k.Value.ToLower());
于 2020-02-26T14:18:23.337 回答
-1

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);
        }
于 2008-10-02T12:03:12.827 回答