Вынести группы байтов в отдельный List (C#)

Всех приветствую! Имеется List, наполненный типом byte. В нем периодически встречается байт 0x01. Задача: необходимо из этого List перенести в новый List все байты, разбив их на группы. Новый List будет содержать элементы byte[]. Каждая группа будет начинаться после очередного 0x01. Например, в ({ 0x01, 0x02, 0x03, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04 }) должно быть 3 группы: 0x02, 0x03; 0x02, 0x03, 0x00; 0x02, 0x02, 0x04.

using System.Collections.Generic;
using System.IO;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System;
using System.Net;
//using WCSUniService.Devices;
//using FastReport.Utils;
using System.Collections;
using System.Security.Cryptography.X509Certificates;

namespace WCSUniService.Models
{
public class Test
{
    static void SortTelegrams(byte id, byte[] bytes)
    {
        List<byte> items = new List<byte>();
        items.AddRange(bytes);
        List<byte[]> telegrams = new List<byte[]>();
        //int index = telegrams.Fi((item) => item == id);
        // { 0x01, 0x02, 0x03, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04 };
        byte[] telegramArr = new byte[4];
        for (int i = 0; i < items.Count;)
        {
            if (items[i] == id)
            {
                ++i;
                int j = 0;
                while (items[i] != id)
                {
                    telegramArr[j] = items[i];
                    ++j;
                    if (items[i] != id)
                        ++i;
                }
                telegrams.Add(telegramArr);
            }
        }

        for (int i = 0; i < telegrams.Count; i++)
        {
            Console.WriteLine(telegrams[i]);
        }

        //foreach (byte telegram in telegrams)
        //{
        //    if (telegram == id)
        //    {
        //        Console.WriteLine();
        //        Console.Write(telegram + "\t");
        //    }
        //    else
        //        Console.Write(telegram + "\t");
        //}
    }

    public static void Main(string[] args)
    {
        byte[] bytes = new byte[] { 0x01, 0x02, 0x03, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04 };
        //LingerOption
        SortTelegrams(1, bytes);
    }
}
}

Ответы (2 шт):

Автор решения: rotabor

@aepot Предлагаю упростить

List<byte> list = new List<byte>();
foreach (byte item in bytes)
{
    if (item != 1)
    {
        list.Add(item);
    }
    else if (list.Count > 0)
    {
        lists.Add(list);
        list = new List<byte>();
    }
}
if (list.Count > 0)
{
    lists.Add(list);
}
→ Ссылка
Автор решения: Alexander Petrov

Предлагаю посмотреть на библиотеку MoreLINQ.
С её помощью решение получается лаконичным.

using MoreLinq;

byte[] bytes = new byte[] {
    0x01, 0x02, 0x03, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04 };

IEnumerable<IEnumerable<byte>> result1 = bytes
    .Split((byte)0x01)
    .Where(x => x.Any());

foreach (var items in result1)
    Console.WriteLine(string.Join(", ", items));

Обратите внимание: в результате будет получен тип IEnumerable<IEnumerable<byte>>.
Если нужен именно List<byte[]>, то слегка изменяем код:

List<byte[]> result2 = bytes
    .Split((byte)0x01, items => items.ToArray())
    .Where(x => x.Length > 0)
    .ToList();

Конечно, не стоит тащить в свой проект дополнительную библиотеку ради одного метода. Но полезных методов в ней много и она вполне может пригодиться для решения других задач.

→ Ссылка