6

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() メソッドが大文字と小文字を区別しないように、これに代わる方法を知っていますか?

4

7 に答える 7

35

はい - ディクショナリ コンストラクター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

System.Collections.Specialized.StringDictionary() が役立つ場合があります。MSDN の状態:

「キーは大文字と小文字を区別しない方法で処理されます。文字列辞書で使用される前に小文字に変換されます。

.NET Framework バージョン 1.0 では、このクラスはカルチャに依存した文字列比較を使用します。ただし、.NET Framework バージョン 1.1 以降では、このクラスは文字列を比較するときに CultureInfo.InvariantCulture を使用します。カルチャが比較と並べ替えに与える影響の詳細については、「特定のカルチャのデータの比較と並べ替え」および「カルチャに依存しない文字列操作の実行」を参照してください。

于 2008-10-16T03:03:37.360 に答える
1

varキーワードを使用して、混乱を取り除くことができます。技術的には、ソースは同じままです。また、その ILanguage パラメーターで何もせず、メソッドをより再利用可能にするため、 Dictionary<string, string> を渡して返すだけです。

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

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 に答える