2008-10-02 94 views
5

我有一个获取IDictionary作为参数的方法。 现在我想提供一个从该字典中检索值的方法,但它应该是大小写不变的。将IDictionary <字符串,字符串>键转换为小写(C#)

所以我解决这个现在是有通过键循环,并把它们转换TOLOWER(静态函数)是这样的:

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()方法不区分套管?

回答

29

是的 - 传递字典构造函数StringComparer.OrdinalIgnoreCase(或另一种情况忽略比较器,根据您的文化敏感度的需要)。

乔恩

+0

谢谢!它工作正常,但我仍然需要查看ILanguage Dictionary并手动添加字典。 没办法,我可以摆脱这一点? – Tigraine 2008-10-02 10:09:10

+0

不是我可以立即想到的。这只是一个循环,尽管...几乎不可读。 如果你使用的是.NET 3.5,你可能简化它一点点,但我不会为此付出汗水。您可以更改原始字典的创建者以首先指定不区分大小写的比较器吗? – 2008-10-02 10:18:21

0

您可以使用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); 
} 
1

您可以自己继承IDictionary,并且只需将调用封送到内部Dictionary实例。使用IEnumerable<T>扩展方法

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. 
-1

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

System.Collections.Specialized.StringDictionary()可能会有帮助。 MSDN规定:

“的关键是在不区分大小写的方式处理;它被翻译它与串字典使用之前为小写

在.NET Framework 1.0版,这类使用文化敏感。但在.NET Framework 1.1及更高版本中,此类在比较字符串时使用CultureInfo.InvariantCulture。有关文化如何影响比较和排序的更多信息,请参阅比较和排序特定文化的数据并执行不区分大小写的字符串操作“。

相关问题