Это может быть потенциально сложная проблема, потому что ArraySegment
на самом деле является только оболочкой представления вокруг исходного массива, и нет ограничения на число ArraySegment
s, созданных вокруг массива (который хранится как ссылка, не копия, в свойстве ArraySegment.Array
), поэтому вы не можете делать какие-либо трюки, просто извлекая массивы за один раз.
При этом ваш исходный код может быть немного улучшен. буферизация копий. Это предполагает, что вы хотите, чтобы значения в сегментах, которые указывают на одинаковые значения в базовом массиве, были продублированы в массиве результатов.
public byte[] ConvertToByteArray(IList<ArraySegment<byte>> list)
{
var bytes = new byte[list.Sum (asb => asb.Count)];
int pos = 0;
foreach (var asb in list) {
Buffer.BlockCopy (asb.Array, asb.Offset, bytes, pos, asb.Count);
pos += asb.Count;
}
return bytes;
}
Это повторяет более чем list
дважды (чтобы получить общее количество, но для больших ArraySe сегментов, буферизованное копирование является большим выигрышем, чем дополнительная итерация, это потеря, в моем синтетическом тесте). Как всегда, измерьте, если это критичный к производительности путь кода.