194

大文字と小文字を区別しないようなメソッドを作成することDictionary<String,...>は可能ですか?ContainsKey

これは関連しているように見えましたが、私はそれを正しく理解していませんでした:c#辞書:宣言によってキーを大文字と小文字を区別しないようにする

4

6 に答える 6

382

これは関連しているように見えましたが、私はそれを正しく理解していませんでした:c#辞書:宣言によってキーを大文字と小文字を区別しないようにする

それは確かに関連しています。解決策は、辞書インスタンスに、標準の文字列比較メソッド(大文字と小文字を区別する)を使用せず、大文字と小文字を区別しないメソッドを使用するように指示することです。これは、適切なコンストラクターを使用して行われます。

var dict = new Dictionary<string, YourClass>(
        StringComparer.InvariantCultureIgnoreCase);

IEqualityComparerコンストラクターは、キーを比較する方法を辞書に指示するを期待します。

StringComparer.InvariantCultureIgnoreCaseIEqualityComparer大文字と小文字を区別しない方法で文字列を比較するインスタンスを提供します。

于 2012-12-21T11:04:46.813 に答える
25
var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");

if (myDic.ContainsKey("hello"))
    Console.WriteLine(myDic["hello"]);
于 2012-12-21T11:07:48.857 に答える
16

サードパーティまたは外部dllから取得された辞書を扱う可能性はほとんどありません。linqを使用する

YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
于 2016-11-17T19:59:16.670 に答える
11

インスタンスの作成を制御できない場合、たとえばオブジェクトがjsonなどから非滅菌化されている場合は、ディクショナリクラスから継承するラッパークラスを作成できます。

public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
    public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
于 2020-07-14T22:14:14.027 に答える
2

ASP.NETCoreコントローラーでcaseINsensitiveディクショナリが必要な場合と同じ種類の問題が発生しました。

私はそのトリックを行う拡張メソッドを書きました。多分これは他の人にも役立つかもしれません...

public static IDictionary<string, TValue> ConvertToCaseInSensitive<TValue>(this IDictionary<string, TValue> dictionary)
{
    var resultDictionary = new Dictionary<string, TValue>(StringComparer.InvariantCultureIgnoreCase);
    foreach (var (key, value) in dictionary)
    {
        resultDictionary.Add(key, value);
    }

    dictionary = resultDictionary;
    return dictionary;
}

拡張メソッドを使用するには:

myDictionary.ConvertToCaseInSensitive();

次に、辞書から次の値を取得します。

myDictionary.ContainsKey("TheKeyWhichIsNotCaseSensitiveAnymore!");
于 2019-10-22T08:08:28.503 に答える
0

これは古い質問ですが、コンストラクターに無視ケースStringComparerを実装していないサードパーティツールから辞書が取得されているという同じ問題がありました。@Soviutが上記の方法から微調整しましたが、これははるかにクリーンであり、値をすぐに処理できると感じています。

var lookup = source.FirstOrDefault(x => x.Key.Equals("...", StringComparison.OrdinalIgnoreCase));
if (lookup.Key != null)
于 2021-10-11T15:46:38.047 に答える