2

言語仕様: C# .NET 3.5/4.0; プロジェクトは、コンパイル済みの DLL、つまり他の製品によって呼び出されたり使用されたりする「モジュール」であることを意図しています。

私の質問は全体的な効率に関するもので、これは「メモリ使用量と CPU サイクル」の決定に帰着する可能性があることを理解しています。これは問題ありません。

メソッドに渡された MyObjects のリストがあり、メソッドは Property2 でリストを並べ替え、それで「何か」を実行し、次に Property1 でリストを並べ替えて「何か他のこと」を行い、人生を続ける必要があります。重要: List は、最初にメソッドに入ったとき (たとえば、データ レイヤーから)、Property1によって既に並べ替えられています。

次のように、Sort はどちらも「カスタム インライン」になります。

myList.Sort((ObjA, ObjB) => ObjA.Prop2.CompareTo(ObjB.Prop2));

2 つのソートを実行することは良い考えですか? または、List を新しい ListB に複製し、Sort を 1 回だけ呼び出す方がよいでしょうか (ListB で、Prop2 によって)。次に、それで「何か」を行い、完了したら、元のリストを「他の何か」に使用して続行します。

私の最初の推測では、「Two Sorts」はより多くの CPU サイクルを回転させますが、「Clone & Sort」はより多くのメモリを使用します (新しい ListB オブジェクトを作成する必要があるため) - はい、List メンバー (MyObjects) が複製されず、新しい ListB によってポイントされるだけです。

考え?

4

2 に答える 2

7

各アイテムが新しいリストにコピーされるため、新規作成は操作になり ますList<T>通常はです。O(n)List<T>.Sort O(n log n)

そのため、2回の並べ替えは遅くなります。コピーするには、リストのコピーが必要です。ここでは、メモリと速度のトレードオフです。

そうは言っても、コピーしても元のリストの並べ替え順序は変更されません。これは、リストをメソッドに渡して変更して戻すことが後でバグの原因になることが多いため、私の意見では大きな利点です。順序を変更するメソッドを必ずしも期待する必要はありません。リストはすでに並べ替えられているため、これは特に当てはまります。順序付きリストの作成で問題が発生した場合は、可能であればその順序を変更しないことをお勧めします。

ただし、実行している内容によってはEnumerable.OrderBy、2番目のセットを順番に引き出して、「作業」を行うことができます。これには、元のリストの順序が変更されないという点で、コピーと同じ利点もあります。

于 2012-07-20T19:00:17.050 に答える
2

の出力を処理してから、破壊的ではないmyList.OrderBy(w=>w.Prop2)ため、元のリストを使用します。OrderBy

于 2012-07-20T19:00:27.607 に答える