Вы можете написать общий вспомогательный метод, например так:
public static IEnumerable<T[]> AsBatches<T>(T[] input, int n)
{
for (int i = 0, r = input.Length; r >= n; r -= n, i += n)
{
var result = new T[n];
Array.Copy(input, i, result, 0, n);
yield return result;
}
}
Затем вы можете использовать его в цикле foreach
:
byte[] byteArray = new byte[123456];
foreach (var batch in AsBatches(byteArray, 640))
{
Console.WriteLine(batch.Length); // Do something with the batch.
}
Или, если вы хотите список партий, просто сделайте это:
List<byte[]> listOfBatches = AsBatches(byteArray, 640).ToList();
Если вы хотите получить фантазию, вы можете сделать это методом расширения, но это рекомендуется только в том случае, если вы будете часто его использовать (не создавайте метод расширения для того, что вы будете вызывать только в одном месте! ).
Здесь я изменил имя на InChunksOf()
, чтобы сделать его более читабельным:
public static class ArrayExt
{
public static IEnumerable<T[]> InChunksOf<T>(this T[] input, int n)
{
for (int i = 0, r = input.Length; r >= n; r -= n, i += n)
{
var result = new T[n];
Array.Copy(input, i, result, 0, n);
yield return result;
}
}
}
Который вы могли бы использовать так:
byte[] byteArray = new byte[123456];
// ... initialise byteArray[], then:
var listOfChunks = byteArray.InChunksOf(640).ToList();
[EDIT] Исправленный терминатор контура от r > n
до r >= n
.