Как я могу превратить мой собственный метод в метод LINQ с цепочкой? - PullRequest
0 голосов
/ 05 мая 2020

У меня есть такой код, который собирает данные в заданном формате c из коллекции ввода и добавляет значение контрольной суммы:

        var data = input.Aggregate(new List<byte>(), (list, item) =>
        {
            list.Add(item.x);
            list.Add(item.y);
            list.Add(item.bytes.Length);
            list.AddRange(item.bytes);
        });
        data.Add(Checksum(data));
        var bytes = data.ToArray();

Мне интересно сделать это одной строкой, но я не могу посмотрим, как я могу связать data с Checksum(), который в настоящее время имеет подпись byte Checksum(IEnumerable<byte> input).

Я думал, что могу сделать что-то вроде:

        IEnumerable<byte> AddCheckSum(IList<byte> input)
        {
         return input.Add(Checksum(input));
        }

        var data = input.Aggregate(new List<byte>(), (list, item) =>
        {
            list.Add(item.x);
            list.Add(item.y);
            list.Add(item.bytes.Length);
            list.AddRange(item.bytes);
        }).AddChecksum().ToArray();

Но я не могу понять как. Это просто?

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Сомневаюсь, что вы вообще хотите 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();
1 голос
/ 05 мая 2020

Используйте метод расширения.

public static class AddChecksumHelpers
{
    public static IEnumerable<byte> AddCheckSum(this IEnumerable<byte> input)
    {
        return input.Concat(new[] { CheckSum(input) });
    }
}

Или вы можете взять и вернуть List<byte>, если у вас есть данные в этом формате, и напрямую вернуть список ввода (после вызова .Add(CheckSum(input))).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...