大文字と小文字を区別しないようなメソッドを作成することDictionary<String,...>
は可能ですか?ContainsKey
これは関連しているように見えましたが、私はそれを正しく理解していませんでした:c#辞書:宣言によってキーを大文字と小文字を区別しないようにする
大文字と小文字を区別しないようなメソッドを作成することDictionary<String,...>
は可能ですか?ContainsKey
これは関連しているように見えましたが、私はそれを正しく理解していませんでした:c#辞書:宣言によってキーを大文字と小文字を区別しないようにする
これは関連しているように見えましたが、私はそれを正しく理解していませんでした:c#辞書:宣言によってキーを大文字と小文字を区別しないようにする
それは確かに関連しています。解決策は、辞書インスタンスに、標準の文字列比較メソッド(大文字と小文字を区別する)を使用せず、大文字と小文字を区別しないメソッドを使用するように指示することです。これは、適切なコンストラクターを使用して行われます。
var dict = new Dictionary<string, YourClass>(
StringComparer.InvariantCultureIgnoreCase);
IEqualityComparer
コンストラクターは、キーを比較する方法を辞書に指示するを期待します。
StringComparer.InvariantCultureIgnoreCase
IEqualityComparer
大文字と小文字を区別しない方法で文字列を比較するインスタンスを提供します。
var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");
if (myDic.ContainsKey("hello"))
Console.WriteLine(myDic["hello"]);
サードパーティまたは外部dllから取得された辞書を扱う可能性はほとんどありません。linqを使用する
YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
インスタンスの作成を制御できない場合、たとえばオブジェクトがjsonなどから非滅菌化されている場合は、ディクショナリクラスから継承するラッパークラスを作成できます。
public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
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!");
これは古い質問ですが、コンストラクターに無視ケースStringComparerを実装していないサードパーティツールから辞書が取得されているという同じ問題がありました。@Soviutが上記の方法から微調整しましたが、これははるかにクリーンであり、値をすぐに処理できると感じています。
var lookup = source.FirstOrDefault(x => x.Key.Equals("...", StringComparison.OrdinalIgnoreCase));
if (lookup.Key != null)