9

辞書キーの大文字小文字を無視するには? 私はこれをやっています:

var map = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
map.Add("e", "Letter e lower case");

string value = null;
if (!map.TryGetValue("E", out value)) {
    Console.WriteLine("Not found");
}

そして、すでに StringComparer.InvariantIgnoreCase を使用しようとしましたが、結果は同じです。大文字の「E」は見つかりません。

編集: OrdinalIgnoreCase を使用しても、環境設定とある種のカルチャ競合が発生する可能性がありますか?

4

3 に答える 3

5

StringComparer.OrdinalIgnoreCase は、System.Globalization.TextInfo の Window API "nativeCompareOrdinalIgnoreCase" 関数への内部呼び出しを使用します。したがって、それは不変の文化ではありません。残念なことに、mscorlib.dll の関数は内部的なものであり、テストすることはできません。

とにかく、前者の代わりに StringComparer.InvariantCultureIgnoreCase を使用する必要があります。

それでも動作しない場合は、IEqualityComparer を再実装できます。

public class StringComparerIgnoreCase : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        if (x != null && y != null)
        {
            return x.ToLowerInvariant() == y.ToLowerInvariant();
        }
        return false;
    }

    public int GetHashCode(string obj)
    {
        return obj.GetHashCode();
    }
}

使用法:

var map = new Dictionary<string, string>(new StringComparerIgnoreCase());
于 2013-12-27T17:22:09.840 に答える
4

私が持っている他のマシン (4 つの VM と 1 つの実機) でテストしたところ、現在の VM (Win7 x64、us_eng、いくつかのポルトガル語設定、.net 4.5) でのみ問題が発生することがわかりました。私の実際のマシンと他の VM では、OrdinalIgnoreCase と InvariantIgnoreCase を使用してテストが正常に動作します。

ですから、その環境には非常に奇妙な何かがあると思いますが、今はそれを調査する時間はありません。

残念ながら、この質問は何人かの人によって役に立たないというフラグが立てられていたため、それを深く調査することに興味をそそられました。

于 2012-09-20T21:02:48.573 に答える
0

大文字と小文字を区別しない辞書キーの Dictionary の宣言は正しいです。

map.ContainsKey("E")とを使用map["E"]して、キーを検索してアクセスすることもできます。

于 2012-09-18T23:33:34.763 に答える