各バッチ (たとえば 20 秒) が互いにできるだけ離れた sを持つように並べ替える必要List
があるint
s の並べ替え (降順) があります。int
たとえば、リストに次の予約が含まれているとします。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
そして、私はそれらを4つのバッチで処理することになりました。予約を4つのリスト(12 / 3)に分割し、4つの各リストを下に移動して、それぞれから1つを取得し、新しく作成された並べ替えられたリストに追加するのが良い方法でしょうか? したがって、新しいリストには次の順序で予約が含まれます。
- 1
- 5
- 9
- 2
- 6
- 10
- 3
- 7
- 11
- 4
- 8
- 12
私の質問で何を求めているのかを理解するのは簡単ではないので、私のコードを見る方が簡単かもしれません! 私は次のアプローチを思いつきましたが、それが私が求めているものを達成するための最良/最もパフォーマンスの高い方法であるかどうか疑問に思っていました:
var bookings = new List<int>();
// <snip>import bookings ints from csv file into bookings list</snip>
bookings = bookings.Distinct().OrderByDescending(x => x).ToList();
int chunkSize = 20;
// get number of chunks/batches
int chunkCount = (int)Math.Ceiling((double)bookings.Count/(double)chunkSize);
// split booking list into number of chunks
// add the ith booking from each chunk into new list
// ToChunks() extension method from http://stackoverflow.com/a/6852288/1578713
var chunkList = bookings.ToChunks(chunkCount).ToList();
var reorderedBookings = new List<int>();
for (int i=0; i<chunkCount; i++)
{
// last chunk may be smaller than chunkSize hence the check
reorderedBookings.AddRange(from chunk in chunkList where chunk.Count() > i
select chunk.ToList()[i]);
}
bookings = reorderedBookings;
背景(本当に知りたい場合)
私の問題は、(csv ファイルからインポートされて注文された予約) を並列バッチ (たとえば 20 個) でList
処理している*ことです。int
例外がスローされるということです(私の制御を超えて)。
これは、何千もの予約を同期的に実行する (例外はスローされません) か、20 奇数を並行して実行するかのトレードオフであり、前述の例外が時々スローされる可能性があります。私は後者のアプローチを選択しました。これは、非同期タスクが完了した後、例外が発生する予約を同期的に実行できるため、より高速だからです。
*いくつかのサービスを呼び出し、各予約int
を順番に渡す