私が持っている場合、大文字と小文字を区別しないDictionary<String,...>
ような方法を作ることは可能ContainsKey
ですか?
これは関連しているように見えましたが、私はそれを正しく理解していませんでした:c#辞書:宣言によってキーの大文字と小文字を区別しません
私が持っている場合、大文字と小文字を区別しないDictionary<String,...>
ような方法を作ることは可能ContainsKey
ですか?
これは関連しているように見えましたが、私はそれを正しく理解していませんでした:c#辞書:宣言によってキーの大文字と小文字を区別しません
回答:
これは関連しているように見えましたが、私はそれを正しく理解していませんでした:c#辞書:宣言によってキーの大文字と小文字を区別しません
それは確かに関連しています。解決策は、辞書インスタンスに標準の文字列比較メソッド(大文字と小文字を区別する)を使用せず、大文字と小文字を区別しない方法を使用するように指示することです。これは適切なコンストラクタを使用して行われます。
var dict = new Dictionary<string, YourClass>(
StringComparer.InvariantCultureIgnoreCase);
コンストラクタは、IEqualityComparer
キーを比較する方法をディクショナリに指示するを期待します。
StringComparer.InvariantCultureIgnoreCase
IEqualityComparer
大文字と小文字を区別しない方法で文字列を比較するインスタンスを提供します。
サードパーティまたは外部のdllからプルされた辞書を扱う可能性はほとんどありません。linqの使用
YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
Any
にSingleOrDefault
取得することはできません、あなたnull
が存在しない場合は、バック、代わりにあなたはへのキーと値のセットの両方を持つkeyvaluepairを取得しますnull
!
Contains
当時あなたが取り組んでいたものの非常に具体的なユースケースのようです。より一般的な役立つ答えとして、私Equals
はより良いと思います。そして、同じことを言うと、で文字列を複製する代わりに、ToLower()
を使用しStringComparison.xxxCase
たほうがよいでしょう。
dict.Keys.Contains("bla", appropriate comparer)
やすさのためにLINQオーバーロードを使用します。
ASP.NET Coreコントローラーで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.InvariantCultureIgnoreCase
ますか?それはそれが言うことをします...