Если речь идет о производительности, мои мысли (в порядке возрастания воздействия):
- Правильный размер списков при их создании спасет лот работы,т.е. выяснить размеры выходного пакета до , когда вы начнете копировать, т.е.
temp = new List<T>(thisChunkSize)
- работа с массивами будет более эффективной, чем работа со списками -
new T[thisChunkSize]
- особенноесли вы используете
BlockCopy
(или CopyTo
, который использует это для внутреннего использования), а не копируете отдельные элементы один за другим - , как только вы рассчитали смещения для каждого из блоков, отдельные блок-копии могутвероятно, будет выполняться параллельно, но я бы не предполагал, что это будет быстрее - пропускная способность памяти будет ограничивающим фактором на этом этапе
- , но исправление ultimate : don '• скопировать данные вообще , но вместо этого просто создать диапазонов поверх существующих данных;например, если использовать массивы,
ArraySegment<T>
поможет;если вы открыты для использования более новых функций .NET, это идеально подходит для Memory<T>
/ Span<T>
- создание диапазонов памяти / диапазона на основе существующего массива является по сути бесплатным и мгновенным - т.е. принимает T[]
и возвращает List<Memory<T>>
или аналогичный.
Даже если вы не можете переключиться на ArraySegment<T>
/ Memory<T>
и т. Д., Возвращая что-то , например , которое все еще можно использовать - то есть List<ListSegment<T>>
где ListSegment<T>
выглядит примерно так:
readonly struct ListSegment<T> { // like ArraySegment<T>, but for List<T>
public List<T> List {get;}
public int Offset {get;}
public int Count {get;}
}
и ваш код работает с ListSegment<T>
, обрабатывая Offset
и Count
соответствующим образом.