問題タブ [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.

0 投票する
2 に答える
1063 参照

.net - Comparer が Sort に ArgumentException をスローさせるのはいつですか?

Sortのドキュメントによると、「comparer の実装がソート中にエラーを引き起こした場合、Sort は ArgumentException をスローします。たとえば、アイテムをそれ自体と比較するときに、comparer が 0 を返さない場合があります。」

与えられた例とは別に、そうでなければいつ起こるか誰か教えてもらえますか?

0 投票する
1 に答える
1531 参照

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 から離れて、比較のために左側にゼロが埋め込まれました。ここにコード:

0 投票する
7 に答える
3973 参照

c# - IComparer を使用したシャッフル

まず、フィッシャー・イェーツ・シャッフルについて知っています。しかし、引数のために、ユーザーがドロップダウン リストから並べ替えオプションを選択できるようにしたいとしましょう。このリストには、「ランダム」オプションが含まれます。彼らの選択の結果に基づいて、ソートを IComparer インスタンスに置き換えたいだけです。IComparer はどのように見えるでしょうか?

Google は多くの欠陥のある結果を表示しますが、これらはすべて次の形式を取ります。

ただし、その実装には偏りがあり、状況によっては例外をスローすることさえあります。バイアスは、次のコードで実証できます。

IComparer<T>では、これらの問題を解決するランダムをどのように実装できるのでしょうか? .Sort()これを行う他の方法が見当たらないため、各呼び出しで個別の IComparer インスタンスを使用するように要求することが許可されてます特定のソート操作内。

私はここから始めましたが、急いで投稿され、非常に遅く、可能なすべてのソートを返すことさえありません(テストでは、欠落しているオプションを数えなければ、少なくともバイアスを排除することが示されています)。Fisher-Yates のような O(n) のパフォーマンスは期待していませんが、合理的なもの (小さな n に対して n log n) が必要であり、考えられるすべての並べ替えが表示されることを期待しています。残念ながら、そのリンクはその質問に対する現在受け入れられている回答であるため、もう少し良いものに置き換えることができることを望んでいます。

他に何もないとしても、これが IComparable ソリューションを探しているすべての Google クエリの磁石になることを望んでいます。つまり、間違ったバージョンを使用するように他の場所に指示するのではなく、ここに行き着くということです。

0 投票する
4 に答える
8604 参照

vb.net - キーでソートされないSortedList - VB.NET

ソートしたいキーと値のペアが必要なので、HashTable の代わりに SortedList を使用することにしました。

以下の順序でデータをSortedListに追加しています。これは、必要な順序です

キーは文字列で、値はオブジェクトのリストです。キーは、2 つの整数値を連結し、「-」で区切ったタイムスロットを表しています。文字列としての「700」は、最初は整数の 0700 でした。

例えば

ただし、これらのキーと値のペアが SortedList に追加されると、順番に表示されます

残念ながら、タイムスロットは変更できない 2 つの整数値として受け取ります。

SortedList で並べ替えを強制する方法はありますか? または、この問題はキーの保管方法が原因ですか? 保存する良い方法はありますか?

0 投票する
1 に答える
2565 参照

arrays - List.SortIComparerのパフォーマンス

int配列のペアをソートしようとしています(int [] a; int [] b;)

Array.Sort(a、b)を使用すると、パフォーマンスが向上します。

ただし、List <>を使用して、構造体にintペアをロードすることをお勧めします。構造体の単純な比較子を提供するオーバーロードでArray.Sort()を使用してこれを機能させることができますが、Array.Sort(a、b)よりも約4倍遅くなります。

それは正常ですか?

0 投票する
5 に答える
92915 参照

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) が返されることがわかります。

しかし、私のリストはまだ「間違った」方法でソートされています。何か不足していますか?私は見当もつかない。

0 投票する
3 に答える
12355 参照

c# - List.Contains 動作の変更

を持ってList<MyObj>class MyObj : IComparableます。インターフェイスごとCompareToMyObjクラスにメソッドを書きましたが、 を使用すると、本来あるべきときに返されます。IComparableList<MyObj>.Contains(myObjInstance)falsetrue

then関数Listを呼び出すときにカスタム比較メソッドを使用することを確認するためにどのように進める必要があるかを理解しているかどうかはわかりません。Contains

これが私のcompareTo実装です:

Symbol プロパティは文字列であることに注意してください。

明確にするために、そのcompareToメソッドに停止点を入れましたが、そこには入りません。

誰もそれを試したことがありますか?

ありがとう。

0 投票する
2 に答える
8999 参照

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 の順序になっているため、何かが間違っています。

0 投票する
3 に答える
219 参照

.net - ステートフルな IComparer の合理的なシナリオはありますか?

IComparer<T>デフォルトのコンストラクターを使用してステートフルを作成したことはありません。Reflector で確認したすべての標準ライブラリの実装もステートレスです。したがって、次のように自由にキャッシュできると想定したいと思いIComparer<T>ます。

それ以外の

では、ここで質問ですIComparer<T>。これが壊れるようなものを書いたり見たりしたことがありますか? はいの場合、それはどのくらい一般的ですか?

編集:この場合、2番目のバージョンのオーバーヘッドが本当に欲しくない理由は、データ構造が永続的であるためです。ノードが親/ルート参照を持たないツリーとして実装されます。したがって、キューごとに比較子への 1 つの参照ではなく、ノードごとに比較子への 1 つの参照になります! 私の当初の設計はIComparable<T>、カスタム比較用のラッパー構造体を使用して作成することをお勧めするだけでした。