将IDictionary <string,string =“”>键转换为小写(C#)</string,>

时间:2008-10-02 09:51:48

标签: c# .net idictionary

我有一个将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()方法不区分套管吗?

7 个答案:

答案 0 :(得分:30)

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

乔恩

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分: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.

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

您也可以尝试这种方式

  POST     | api/save_post            | savePost        | App\Http\Controllers\Api\KnowledgeHubController@index            | api,auth:api 

答案 6 :(得分:-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);
        }