Информация об изменениях

Сообщение Re[13]: Десериализация в массив или в список? от 24.04.2021 22:49

Изменено 24.04.2021 22:54 alexzzzz

Re[13]: Десериализация в массив или в список?
Здравствуйте, Passerby, Вы писали:

A>>Перебирается конечно, но просто в цикле, без создания промежуточных коллекций. В этом и смысл.

P>Если без промежуточной коллекции, то для каждой итерации по-новому разбирается строка (предыдущий разбор нигде в промежуточной коллекции не сохранен).

Нет. В этом примере, чтобы напечатать на экране очередное значение, для каждой итерации перезапуск часов с нуля не происходит
  Скрытый текст
using System;
using System.Collections.Generic;
using System.Threading;

foreach (var value in Generate())
{
    Console.WriteLine(value);
}

IEnumerable<int> Generate()
{
    while (true)
    {
        Thread.Sleep(1000);
        yield return DateTime.Now.Second;
    }
}


Тут тоже
  Скрытый текст
using System;
using System.Collections.Generic;

foreach (var value in Parse(",,,1 20,  300; 4004++"))
{
    Console.WriteLine(value);
}

IEnumerable<int> Parse(string input)
{
    for (int first = 0; first < input.Length; first++)
    {
        if (char.IsDigit(input[first]) == false)
        {
            continue;
        }

        for (int last = first + 1; last < input.Length; last++)
        {
            if (last == input.Length - 1)
            {
                yield return int.Parse(input[first..input.Length]);
                yield break;
            }

            if (char.IsDigit(input[last]) == false)
            {
                yield return int.Parse(input[first..last]);
                first = last;
                break;
            }
        }
    }
}
Re[13]: Десериализация в массив или в список?
Здравствуйте, Passerby, Вы писали:

A>>Перебирается конечно, но просто в цикле, без создания промежуточных коллекций. В этом и смысл.

P>Если без промежуточной коллекции, то для каждой итерации по-новому разбирается строка (предыдущий разбор нигде в промежуточной коллекции не сохранен).

Нет. В этом примере, чтобы напечатать на экране очередное значение, для каждой итерации перезапуск часов с нуля не происходит
  Скрытый текст
using System;
using System.Collections.Generic;
using System.Threading;

foreach (var value in Generate())
{
    Console.WriteLine(value);
}

IEnumerable<int> Generate()
{
    while (true)
    {
        Thread.Sleep(1000);
        yield return DateTime.Now.Second;
    }
}


Тут тоже
  Скрытый текст
using System;
using System.Collections.Generic;

foreach (var value in Parse(",,,1 20,  300; 4004++"))
{
    Console.WriteLine(value);
}

IEnumerable<int> Parse(string input)
{
    var index = 0;

    while (true)
    {
        while (index < input.Length && char.IsDigit(input[index]) == false)
        {
            index++;
        }

        if (index >= input.Length)
        {
            yield break;
        }

        var count = 1;
        while (index + count < input.Length && char.IsDigit(input[index + count]))
        {
            count++;
        }

        yield return int.Parse(input[index..(index + count)]);
        index += count + 1;
    }
}