問題タブ [stringcomparer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - ワイルドカード (*) をサポートする System.StringComparer
ワイルドカード (*) と incase-sensitivity をサポートする StringComparer を持つ高速な .NET クラス/ライブラリを探しています。何か案は?
php - テキストの比較方法
タイトルのように、テキストを比較するには?. 例については、textdiff.com にアクセスしてください。
c# - 匿名型は別の型から継承できますか?
StringComparer.OrdinalIgnoreCase
プロパティに関するMSDNのドキュメントによると:
OrdinalIgnoreCase プロパティは、実際にはStringComparerクラスから派生した匿名クラスのインスタンスを返します。
これは私がよく知らない機能ですか? 継承のある匿名型ですか? または、「匿名クラス」とは、単に「から派生した内部クラスStringComparer
であり、クライアント コードには表示されない」という意味でしたか?
c# - SQL の Latin1_General_CI_AS に相当する .NET StringComparer とは
データベースと C# コードの間にキャッシュ レイヤーを実装しています。アイデアは、クエリへのパラメーターに基づいて特定の DB クエリの結果をキャッシュすることです。データベースはデフォルトの照合順序を使用しています -SQL_Latin1_General_CP1_CI_AS
またはLatin1_General_CI_AS
のいずれかです。簡単なグーグル検索に基づいて、同等性と同等であり、並べ替えとは異なります。
データベースの照合が使用しているように、少なくとも等価テストとハッシュコード生成のために、同じ動作を提供できる .NET StringComparer が必要です。目標は、C# コードの .NET ディクショナリで StringComparer を使用して、特定の文字列キーが既にキャッシュにあるかどうかを判断できるようにすることです。
非常に単純化された例:
StringComparer がデータベースの照合順序と一致することが重要な理由は、偽陽性と偽陰性の両方がコードに悪影響を与えるためです。
2 つのキー A と B が異なるとデータベースが認識しているときに StringComparer がこれらのキーが等しいと言う場合、データベースにはこれら 2 つのキーを持つ 2 つの行が存在する可能性がありますが、A と B を要求された場合に 2 番目のキーが返されるのをキャッシュが防ぎます。 B の連続 - B の get が誤ってキャッシュにヒットし、A に対して取得されたオブジェクトを返すためです。
データベースが A と B が等しいと認識しているときに StringComparer が A と B が異なると言う場合、問題はより微妙ですが、それほど問題ではありません。両方のキーに対する GetObject 呼び出しは問題なく、同じデータベース行に対応するオブジェクトを返します。しかし、キー A を指定して SaveObject を呼び出すと、キャッシュが正しくないままになります。古いデータを持つキー B のキャッシュ エントリがまだ存在します。後続の GetObject(B) は古い情報を提供します。
したがって、私のコードが正しく機能するためには、 StringComparer が等価テストとハッシュコード生成のデータベースの動作に一致する必要があります。これまでの私のグーグル検索では、SQL 照合と .NET 比較が完全に同等ではないという事実について多くの情報が得られましたが、違いが何であるか、並べ替えの違いのみに限定されているかどうか、または見つけることが可能かどうかについての詳細はありません。汎用ソリューションが必要ない場合は、特定のSQL 照合順序と同等の StringComparer 。
(補足: キャッシング レイヤーは汎用的なものであるため、キーの性質や適切な照合順序について特定の仮定を立てることはできません。データベース内のすべてのテーブルは、同じ既定のサーバー照合順序を共有しています。一致する必要があるだけです。存在する照合順序)
c# - C#で辞書比較ツールの種類を判別するにはどうすればよいですか?
関数で受け取るディクショナリに大文字と小文字を区別しない比較子があるかどうかを判断する必要があります。
すなわち。大文字と小文字を区別しない辞書は、次のように宣言されます。
関数に辞書を受け取ると、.Comparerプロパティにアクセスしてそのタイプを確認できますが、取得できるのは-
使用されているComparerがStringComparer.OrdinalIgnoreCaseであるかどうかを確認するにはどうすればよいですか?
c# - c#SortedList正常に追加されたキーの .ContainsKey は false を返します
以下の更新 3 を確認してください。私が遭遇した問題は、.Net 4.0、4.0 クライアント、および 4.5 の c# 文字列比較器に関する既知の深刻な問題に関連していることがわかりました。入力の順序と使用される並べ替えアルゴリズム)。この問題は 2012 年 12 月に Microsoft に報告され、「修正されない」としてクローズされました。回避策はありますが、非常に遅いため、大規模なコレクションではほとんど実用的ではありません。
不変の PatriciaTrie を実装する際に、そのパフォーマンスを System.Collections.Generic.SortedList と比較したいと思いました。次のファイルhttps://github.com/rkapsi/patricia-trie/blob/master/src/test/resources/org/ardverk/collection/hamlet.txtを使用して、テスト用の入力単語リストを作成しました。
Comparer<string>.Default
キー比較子としてまたはを使用して c# SortedList に各単語を挿入する場合、StringComparer.InvariantCulture
正常に挿入されたエントリの数は、通常の検索方法を使用して取得することはできません (たとえばContainsKey
、false を返します) が、キーは次のようにリストに存在します。リストを反復することによって観察されます。
さらに興味深いことに、並べ替えられたリストから取得したキーを、 を使用して見つけることができなかった検索キーと比較すると、比較子は値 '0' を返しますContainsKey
。
以下の完全な例は、私のシステムでのこの問題を示しています。
この予期しない奇妙な動作について説明できる人はいますか?
SortedList で使用される比較子を変更するとStringComparer.Ordinal
(たとえば、上記の例で変更fail
することによりfalse
)、問題はなくなります。これは比較の問題を示しているようですが、その理由はよくわかりません。
更新 セバスチャンが指摘したように、ここで説明されている問題は、.Net 3.5 および 3.5 クライアント プロファイルには現れません。.Net 4.0、4.0 クライアント、および 4.5 で実行されます。
さらに掘り下げた後、リストからソートされたキーを取得しArray.BinarySearch
てそれらのキーを実行すると、 を使用して見つからない同じキーに対して負の (見つからない) 値も返されることに気付きましSortedList.ContainsKey
た。したがって、これはキーのソート順が正しくないことを示唆しています。
リストから既に並べ替えられたキーを取得しArray.Sort
、出力の並べ替え順序を使用してそれらを並べ替えると、問題のあるキーとは異なります。
そのため、特定の配列のソート順が正しいかどうか (リストの比較演算子を使用して) をチェックする関数を追加し (つまり、前のキーは常に小さく、後続のキーは常に大きい)、次のように異なる単語への入力を制限しました。比較者。この関数を 3 つの異なる入力に適用しました (すべて同じ比較子を使用)。
- SortedList の Keys コレクション。
- これらのキーに対する Array.Sort の出力。
- ファイルからの入力に対する Array.Sort の出力。
(2) と (3) の出力は同一であり、(1) とは異なります。ただし、(2) と (3) の Array.Sort 出力で Array.BinarySearch を実行すると、同じキーが見つかりません (< 0 が返されます)。また、正しい並べ替え順序をチェックする関数は、3 つのケースすべてで、関連する問題のあるキーの並べ替え順序が正しくないことを示しています。
この時点で、信じられないほど愚かなことをしたことを願っています。簡単な説明があります。うまくいけば、誰かが私にそれを指摘することができます.
サンプル コードは、私の追加のトラブルシューティング実験で更新されています。出力のスクリーンショットはhttp://imgur.com/DU8SCsAにあります。
更新 2 OK、.Net 4.0 で導入された c# 文字列比較器に関する非常に深刻な問題のように思われる問題に絞り込みました。
要約すると、a1、a2、a3 の 3 つの値があるとします。あらゆる種類の並べ替えが正しく機能するためには、 ifa1 < a2
とa2 < a3
that が比較の一貫性を維持するために、結果として次のことも成り立つことが期待されますa1 < a3
。
ただし、これは c# 文字列比較子には当てはまりません (少なくともComparer<string>.Default
との場合StringComparer.InvariantCulture
)。
以下の小さなプログラムは、まさにこの問題を示しています。
これはその出力です:
結論は、C# 文字列演算子を使用して決定された並べ替え順序に依存するのは安全ではないように思われますか、それとも何か不足していますか?
更新 3 この問題は 2012 年 12 月に MS に報告されたようで、「修正されません」というステータスで閉じられており、かなり残念です。以下のコメントに投稿されたリンクを参照してください (私の評判ポイントが限られているため、ここに投稿できないようです)。これには、私が実装して使用した回避策もリストされており、標準の比較子で観察された問題が実際に解決されることを確認しています。
この回避策の問題点は、たとえばStringComparer.InvariantCulture
.
両方の比較子を使用して、指定された単語リストを 1000 回並べ替えるときにかかった時間:
したがって、マイクロソフトが再考するか、誰かが実行可能な代替案を知っていることを願っています. それ以外の場合、残っている唯一のオプションは、を使用してフォールバックすることStringComparer.Ordinal
です。
c# - C# で 2 つの文字列間で共通の文字数を見つける
2 つの文字列を取り、両方に共通する文字数を返すメソッドを探しています。
「G010」と「G1820A」は、G、0、および 1 文字が両方に存在するため、3 を返す必要があります。
char が両方に 2 回存在する場合は、次のように別々にカウントする必要があります。
"G12AA" & "GAA2" は、G、A、A、および 2 文字が両方に存在するため、4 を返す必要があります。
これについて何か助けはありますか?これまでのところ、Google 検索はあまり役に立ちませんでした。
sorting - アンダースコア付きの文字列のPowershellソート
次のリストは正しくソートされません (IMHO):
私の便利な ASCII チャートと Unicode C0 Controls および Basic Latin チャートには、序数が 95 (U+005F) のアンダースコア (低い線) があります。これは、大文字の AZ よりも大きい数字です。並べ替えは、アンダースコアで終わる文字列を最後に配置する必要がありました。
Get-Culture は en-US です
次の一連のコマンドは、私が期待することを行います。
次に、同じ 3 つの文字列を含む ANSI エンコード ファイルを作成します。
アンダースコア/ローラインを含む文字列が正しくソートされていません。私は何が欠けていますか?
編集:
この例 #4 を参照してみましょう。
両方のステートメントが False であるか、両方が True である必要があるようです。最初のステートメントで文字列を比較し、次に Char 型を比較しています。文字列は単に Char 型のコレクションであるため、2 つの比較操作は同等である必要があると思います。
そして今、例#5:
2 つの ArrayList には同じ文字列が含まれていますが、並べ替えが異なります。なんで?
vb.net - 精度のために 2 つの文字列を比較する方法
私はこの役に立たないプログラムを作成して、適切にプログラミングに戻るためだけに、2 つの文字列を正確に比較するのに苦労しています。
私は基本的に2つの文字列を持っています:(例)
(比較する定数) str1 = "abcdefghijkl"
(入力) str2 = "abcdefghjkli"
str2 は "h" まで (および "h" を含む) 正しいです。文字列の何%が正しいか知りたいです。
これは私がこれまでに持っているコードです:
End Function 2 つのコメント セクションは、ここに来る前に試した別のアプローチです。コードは次のように実行する必要があります
compareString("abcdefghijkl", "abcdefghjkli")
strNum は 8 になります。
一致率 = ((8 / 12)*100)
*一致率 = 75
リターン 75
しかし、それはこれを返さない、行上
「インデックスが配列の範囲外でした」というエラーが返されます。私はエラーを理解していますが、どこが間違っているのかではありません。
私が提供できる情報が他にある場合は、通知が表示されたらすぐに提供します:)
前もって感謝します、
リンスレップ
c# - 文字列を C# の特殊文字と比較する
2 つの文字列 " CZSczs
" - " ČŽŠčžš
" があり、文字列を比較したときに true を返したいと考えています。文字列の比較を試みましたが、うまくいきません。