Сомневаюсь, что вы вообще хотите Aggregate
; Linq кажется более компактным для чтения с SelectMany
и Concat
:
var data = input
.SelectMany(item => new byte[] {item.x, item.y, item.bytes.Length}.Concat(item.bytes));
var bytes = data
.Concat(new byte[] {Checksum(data)})
.ToArray();
, но я предлагаю foreach
решение с явным List<byte> data
:
List<byte> data = new List<byte>();
foreach (var item in input) {
data.Add(item.x);
data.Add(item.y);
data.Add(item.bytes.Length);
data.AddRange(item.bytes);
}
data.Add(Checksum(data));
var bytes = data.ToArray();
Наконец, если вы хотите вычислить фрагмент за один go, вы можете обернуть его в метод расширения :
public static class MyInputExtensions {
public static byte[] ToBytesWithCheckSum(this IEnumerable<MyInput> input) {
if (null == input)
throw new ArgumentNullException(nameof(input));
List<byte> data = new List<byte>();
foreach (var item in input) {
data.Add(item.x);
data.Add(item.y);
data.Add(item.bytes.Length);
data.AddRange(item.bytes);
}
data.Add(Checksum(data));
return data.ToArray();
}
}
, тогда вы можете использовать ToBytesWithCheckSum()
как если это метод сбора input
:
byte[] bytes = input.ToBytesWithCheckSum();