[解決済み] HashSet<string>の大文字と小文字を区別しない機能
質問
HashSetパラメータを持つメソッドを持っています。そして、私はその中で大文字と小文字を区別しないContainsを行う必要があります。
public void DoSomething(HashSet<string> set, string item)
{
var x = set.Contains(item);
...
}
既存のHashSetを大文字小文字を区別しない(新規に作成しない)ようにする方法はありますか?
最高のパフォーマンスで解決する方法を探しています。
編集
Containsは複数回呼び出すことができます。そのため、IEnumerableの拡張は、ネイティブのHashSet Containsメソッドよりもパフォーマンスが低いため、私には受け入れられません。
解決方法
質問に対する答えは「NO」であり、不可能です。
public HashSet<string> EnsureCaseInsensitive(HashSet<string> set)
{
return set.Comparer == StringComparer.OrdinalIgnoreCase
? set
: new HashSet<string>(set, StringComparer.OrdinalIgnoreCase);
}
どのように解決するのですか?
この
HashSet<T>
コンストラクタにはオーバーロードがあり、独自の
IEqualityComparer<string>
. これらのうちいくつかは、すでに静的な
StringComparer
クラスで定義されており、そのうちのいくつかは大文字小文字を無視します。例えば
var set = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
set.Add("john");
Debug.Assert(set.Contains("JohN"));
を構築する際に、この変更を行う必要があります。
HashSet<T>
. いったん存在すると
IEqualityComparer<T>
を変更することはできません。
念のためお伝えしておきますが、デフォルトでは (何も渡さなければ)
IEqualityComparer<T>
に
HashSet<T>
のコンストラクタ) を使用する場合、それは
EqualityComparer<T>.Default
を使います。
編集
私が回答を投稿した後、質問が変更されたようです。 もし、ケース
を無視する
を行う必要がある場合、既存のケース
センシティブ
HashSet<string>
のように、線形探索を行う必要があります。
set.Any(s => string.Equals(s, item, StringComparison.OrdinalIgnoreCase));
これを回避する方法はない。
関連
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] HTTP POST Web リクエストの作成方法
-
[解決済み] .NETでC#オブジェクトをJSON文字列に変換するには?
-
[解決済み] .NETでフォーマット文字列のブレース(中括弧)をエスケープする方法
-
[解決済み] UTF-8 byte[]を文字列に変換する方法
-
[解決済み] HashSetの値を構造的に初期化する方法は?
-
[解決済み] 文字列の最初の文字を大文字にする(最大限のパフォーマンスを発揮する)
-
[解決済み] 定義 HashSetとは何ですか?
-
[解決済み】大文字・小文字を区別しない「Contains(string)
-
[解決済み】ハッシュセットとツリーセットの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない