問題タブ [icomparer]
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.
.net - Comparer が Sort に ArgumentException をスローさせるのはいつですか?
Sortのドキュメントによると、「comparer の実装がソート中にエラーを引き起こした場合、Sort は ArgumentException をスローします。たとえば、アイテムをそれ自体と比較するときに、comparer が 0 を返さない場合があります。」
与えられた例とは別に、そうでなければいつ起こるか誰か教えてもらえますか?
c# - IComparer の問題 + .NET で文字列の配列 (FILE_10 > FILE_2) を自然に並べ替えるにはどうすればよいですか?
私の投稿の一番下で解決しました。
またはより具体的には:
たくさんの FileInfo オブジェクトがあります (隠しファイル、システム ファイル、再解析ポイント ファイルを除外するには、FileInfo オブジェクトが必要です)。
FileInfo.FullName に基づいて FileInfo[] を自然に並べ替える必要があります。したがって、FILE_10.ext は FILE_2.ext の後に来る必要があります。幸いなことに、FileInfo[] には拡張子が 1 つのみのファイルが含まれています。
私は比較子を実装しました:
ここで、int.Parse が適切なポイントでキャッチできなかった OverflowException をスローするという問題が発生します (何らかの理由で return ステートメントの行で再発し、1 レベル上でインテリジェントに処理できません。そこの)。
問題は次のとおりです。この種の事前実装された比較子はありますか? そして、面白い場所で例外が発生する理由は何でしょうか?
呼び出しコード:
EDIT1: Int.Parse は、大きすぎる数値に遭遇すると OverflowException をスローします。定期的に発生するべきではありませんが、カバーしてほしいです。
EDIT2:私は自分のComparerを調整することになりました。int.Parse から離れて、比較のために左側にゼロが埋め込まれました。ここにコード:
c# - IComparer を使用したシャッフル
まず、フィッシャー・イェーツ・シャッフルについて知っています。しかし、引数のために、ユーザーがドロップダウン リストから並べ替えオプションを選択できるようにしたいとしましょう。このリストには、「ランダム」オプションが含まれます。彼らの選択の結果に基づいて、ソートを IComparer インスタンスに置き換えたいだけです。IComparer はどのように見えるでしょうか?
Google は多くの欠陥のある結果を表示しますが、これらはすべて次の形式を取ります。
ただし、その実装には偏りがあり、状況によっては例外をスローすることさえあります。バイアスは、次のコードで実証できます。
IComparer<T>
では、これらの問題を解決するランダムをどのように実装できるのでしょうか? .Sort()
これを行う他の方法が見当たらないため、各呼び出しで個別の IComparer インスタンスを使用するように要求することが許可されています。特定のソート操作内。
私はここから始めましたが、急いで投稿され、非常に遅く、可能なすべてのソートを返すことさえありません(テストでは、欠落しているオプションを数えなければ、少なくともバイアスを排除することが示されています)。Fisher-Yates のような O(n) のパフォーマンスは期待していませんが、合理的なもの (小さな n に対して n log n) が必要であり、考えられるすべての並べ替えが表示されることを期待しています。残念ながら、そのリンクはその質問に対する現在受け入れられている回答であるため、もう少し良いものに置き換えることができることを望んでいます。
他に何もないとしても、これが IComparable ソリューションを探しているすべての Google クエリの磁石になることを望んでいます。つまり、間違ったバージョンを使用するように他の場所に指示するのではなく、ここに行き着くということです。
vb.net - キーでソートされないSortedList - VB.NET
ソートしたいキーと値のペアが必要なので、HashTable の代わりに SortedList を使用することにしました。
以下の順序でデータをSortedListに追加しています。これは、必要な順序です
キーは文字列で、値はオブジェクトのリストです。キーは、2 つの整数値を連結し、「-」で区切ったタイムスロットを表しています。文字列としての「700」は、最初は整数の 0700 でした。
例えば
ただし、これらのキーと値のペアが SortedList に追加されると、順番に表示されます
残念ながら、タイムスロットは変更できない 2 つの整数値として受け取ります。
SortedList で並べ替えを強制する方法はありますか? または、この問題はキーの保管方法が原因ですか? 保存する良い方法はありますか?
arrays - List.SortIComparerのパフォーマンス
int配列のペアをソートしようとしています(int [] a; int [] b;)
Array.Sort(a、b)を使用すると、パフォーマンスが向上します。
ただし、List <>を使用して、構造体にintペアをロードすることをお勧めします。構造体の単純な比較子を提供するオーバーロードでArray.Sort()を使用してこれを機能させることができますが、Array.Sort(a、b)よりも約4倍遅くなります。
それは正常ですか?
c# - 独自の IComparer を使用するLinq OrderBy を使用
私はジェネリックを持っています
where には、次のような値を含むMyClass
プロパティがあります。InvoiceNumber
200906/1
200906/2
..
200906/10
200906/11
200906/12
私のリストはにバインドされています
linqでのソートをサポートしています:
ただし、デフォルトの比較子は (想定どおり) 次のように並べ替えます。
200906/1
200906/10
200906/11
200906/12
200906/2
この場合、これは厄介です。
今、私はこれで自分のものを使いたいと思っていますIComparer<T>
。次のようになります。
ApplySortCore
これを使用するようにコードを変更しましたIComparer
:
コードをデバッグすると、MyComparer.Compare(object, object)
が複数回呼び出され、compare メソッドに対して正しい値 (-1、0、1) が返されることがわかります。
しかし、私のリストはまだ「間違った」方法でソートされています。何か不足していますか?私は見当もつかない。
c# - List.Contains 動作の変更
を持ってList<MyObj>
いclass MyObj : IComparable
ます。インターフェイスごとCompareTo
にMyObj
クラスにメソッドを書きましたが、 を使用すると、本来あるべきときに返されます。IComparable
List<MyObj>.Contains(myObjInstance)
false
true
then関数List
を呼び出すときにカスタム比較メソッドを使用することを確認するためにどのように進める必要があるかを理解しているかどうかはわかりません。Contains
これが私のcompareTo実装です:
Symbol プロパティは文字列であることに注意してください。
明確にするために、そのcompareToメソッドに停止点を入れましたが、そこには入りません。
誰もそれを試したことがありますか?
ありがとう。
c# - List (sort) のカスタム IComparer の問題 - c#
誰でも助けてもらえますか、ソートに問題があります。ソートしたと思っていましたが、機能していないようです。
次の値を格納するリストがあります
8,6,10,11,7
私はまた別のリストを持っています(私のクラスのアクセサリーには現在accessoriesIdというプロパティがあり、クラスは現在6,7,8,10,11であるidの順序になっています)
したがって、それらを 6,7,8,10,11 から、8,6,10,11,7 という単純なリストから使用される順序に並べ替える必要があります。
私は icomparable を持っており (以下を参照)、このように呼び出しています - 入りますが、リストにはまだすべてのクラスが含まれていますが、まだ 6,7,8,10,11 の順序になっているため、何かが間違っています。
.net - ステートフルな IComparer の合理的なシナリオはありますか?
IComparer<T>
デフォルトのコンストラクターを使用してステートフルを作成したことはありません。Reflector で確認したすべての標準ライブラリの実装もステートレスです。したがって、次のように自由にキャッシュできると想定したいと思いIComparer<T>
ます。
それ以外の
では、ここで質問ですIComparer<T>
。これが壊れるようなものを書いたり見たりしたことがありますか? はいの場合、それはどのくらい一般的ですか?
編集:この場合、2番目のバージョンのオーバーヘッドが本当に欲しくない理由は、データ構造が永続的であるためです。ノードが親/ルート参照を持たないツリーとして実装されます。したがって、キューごとに比較子への 1 つの参照ではなく、ノードごとに比較子への 1 つの参照になります! 私の当初の設計はIComparable<T>
、カスタム比較用のラッパー構造体を使用して作成することをお勧めするだけでした。