2017-11-08 6 views
2

DateTimeプロパティでソートされた参照型のリストがあります。それらの一部は同一のDateTime'sです。例えば、複数の野球の試合はまったく同じ時間に始まります。C#DateTimeリストに同じDateTime値が含まれている場合のOrderBy

OrderByが毎回同じ方法でソートすることを確認したいと思います。つまり、A→B→Cの順で入力を提供したためです。出力はA→B→C(すべての項目は同じDateTimeです)となります。

注文が保存されていることを確認するための単体テストを書いた。テストは合格しました。しかし、実際に何が起こっているかわからなくても、私はまだ自信を持っていません。

誰かが私のためにOrderByの動作を確認できますか?私はGoogleを介して検索しようとし、何か決定的なものを見つけることができませんでした。

+0

OrderByを呼び出しているコレクションのタイプは何ですか? – Dave

+0

F12を押しましたか? VSの設定に応じて、これは.Net Frameworkからソースコードをロードし、自分で見つけることができます。 –

+0

この回答を見てください(リスト内のLINQオブジェクトと同じに見えます)https://stackoverflow.com/questions/25922348/linq-orderby-does-it-always-return-the-same-注文リスト – d219

答えて

4

を変更する必要はありませんあなたが求めているコンセプトの名前は、Stable Sortと呼ばれています。

これを知っているなら、documentation for Enumerable.OrderByをチェックして、確かに安定したソートアルゴリズムを使用していることを確認できます。 Remarksセクションの末尾から:

このメソッドは安定した並べ替えを実行します。つまり、2つの要素のキーが等しい場合、要素の順序は保持されます。

さらに、この質問のコメントにLinq-to-SQLのいくつかの悩みがありました。あなたのデータがすでにList<T>オブジェクトにある場合は、でなく、Linq-to-SQLを使用しているです。しかし、Linq-to-SQLはEnumerable.ORderByではなくIQueryable.OrderByを使用し、IQueryable.OrderByではではないことに注意してください。は安定した並べ替えを保証します。 安定した並べ替えを取得しますが、データベースエンジンの機能によって異なります。

+0

パーフェクトありがとう! – sapbucket

2

要するに、OrderBy値が同一であれば、OrderByは順序を変更しません。だからあなたがそれを呼んだコレクションが注文されれば、それはその注文を保つでしょう。それがリストであればすべていいですが、他のコレクションタイプでは辞書やハッシュセットなどの順序が保証されないため、基本コレクションでの順序が保証できないため、その順序が変わる可能性があると思います。

編集:誰かがオブジェクトにコメントLINQで述べたように[並べ替えが安定(または決定論一種)であるので、順序は同じになります等しいと考えるたびに、アイテムは、その順序が正式

+0

これは、リスト上のOrderByに対して同じことが懸念される注文を保証しない辞書のためです。万一、この動作に関する公式文書をどこで読むことができるのか分かりますか? – sapbucket

+1

私に狩りをさせてください。リストは索引でアクセスできるので、同じ順序のままです。だから、そうでなければmyList [1]を2回呼び出すと別の結果が出る可能性がありますが、そうでない場合は – Dave

+1

こちらをご覧ください。 https://msdn.microsoft.com/en-us/library/bb534966.aspx。キーの段落は「このメソッドは安定したソートを実行します。つまり、2つの要素のキーが等しい場合、要素の順序は保持されますが、不安定な並べ替えは同じキーを持つ要素の順序を保持しません。 " – d219

1

まず、excelent answer of Joelを必ずお読みください。

OrderBy(c => c.MyDate).ThenBy(n => n.MyId) 

あなたが二階を適用することができますこの方法は、場合:あなたはLinq2Objectの安定ソート(例えばEF)に頼ることができないならば、あなたもThenByのオプションを持っている、と述べた

最初に複数の同じ値があります。

関連する問題