質問

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

役に立ちましたか?

解決

はい-ディクショナリコンストラクター StringComparer.OrdinalIgnoreCase (または、カルチャに依存するニーズに応じて、大文字と小文字を区別しない別の比較子)を渡します。

ジョン

他のヒント

StringDictionaryを使用すると、キーは作成時に小文字に変換されます。

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

var キーワードを使用して、混乱を取り除くことができます。技術的には、ソースは同じままです。また、Dictionary&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);
}

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.

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

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

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

IEnumerable&lt; T&gt; 拡張メソッドを使用した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);
        }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top