Выбрать блок данных между определёнными строками

Есть массив строк

string[] Lines = File.ReadAllLines(file);

файл примерно следующего содержания:

1
строка1
строка2
строка3
строка4
строка5

2
строка1
строка2
строка3


3
строка1
строка2
4
строка1
строка2
строка3
5
строка1
6
итд..
    

нужно вытаскивать строки между цифрами в отдельные Span для последующей обработки.

сделал так:

            int counter = -1;
            int firstBlockLine = -1;
            int lastBlockLine = -1;
for(int i = 0; i < Lines.Length; i++)
        {
            if(int.TryParse(Lines[i],out int value))
            {
                if (counter < 0)
                {
                    counter = value; // first line in file
                    firstBlockLine = i;


                    continue;
                }

                counter++;

                if (counter <= value)
                {
                    
                    if (firstBlockLine >= 0)
                    {
                        lastBlockLine = i - 1;
                    }
                    else
                    {
                        firstBlockLine = i;
                    }
                }

                if (lastBlockLine > 0 && firstBlockLine >= 0)
                {                        
                    Debug.WriteLine($"Block begin:{firstBlockLine}, end:{lastBlockLine}");
                    firstBlockLine = -1;
                    lastBlockLine = -1;
                }
            }

Но в этом варианте пропускается каждый второй блок. как мне получить индексы начала и конца всех блоков?


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

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

Что-то много наворотили. Или отладка, или начать с простого:

last = 999999999;
for(int i = 0; i <= Lines.Length; i++)
    {
        if(i==Lines.Length ||  int.TryParse(Lines[i],out int value))
        {
            if (i > last)
                Debug.WriteLine($"Block begin:{last}, end:{i}");
            last = i;
        }
    }

Если работает, то подкорректировать индексы для вывода

→ Ссылка
Автор решения: SelfishCrawler
    string[] Lines = File.ReadAllLines(file);
    int parse = 0;
    var idx = Lines.Select((v, i) => new { Index = i, Value = v }).Where(x => int.TryParse(x.Value, out parse)).Select(x => x.Index);
    foreach (var i in idx)
        Debug.WriteLine(i);

Вывод на вашем примере:

0
7
13
16
20
22
→ Ссылка