2

1 億を超えるオブジェクトを含むバイナリ ファイルがあり、オブジェクトを使用してファイルを読み取り、BinaryReader( ) オブジェクトを返しYieldます (ファイル リーダーとIEnumerable実装はこちら: IEnumerable のパフォーマンス比較とソース内の各アイテムのイベントの発生? )

オブジェクトのプロパティの 1 つは、オブジェクトのランク ( などA5) を示します。top nプロパティに基づいてソートされたオブジェクトを取得したいとします。

関数のコードを見ましたOrderBy。QuickSort アルゴリズムを使用しています。と関数でIEnumerable結果をソートしようとしましたが、関数はクイックソートを実装するために合計オブジェクト数のサイズの配列を作成するため、例外が発生しました。OrderByTake(n)OutOfMemoryOrderBy

実際、必要なメモリの合計はnなので、大きな配列を作成する必要はありません。たとえば、Take(1000) を取得すると、1000 個のオブジェクトのみが返され、オブジェクト全体の合計数には依存しません。

OrderBy関数で関数の結果を取得するにはどうすればよいTakeですか? 言い換えれば、エンドユーザーによって定義された容量を持つ制限付きまたはブロックされたソート済みリストが必要です。

4

2 に答える 2