Здравствуйте, Serginio1, Вы писали: S> members чем является?
В C# нет такого типа. S> Не всегда. Еще раз пример массива.
Не еще раз, а хотя бы один пример. S> Ты можешь не десериализовать его полностью или через тот же IEnumerable считывая по одному элементу.
Массив просто нельзя десериализовать. Это не последовательность символов. Массив можно только сериализовать. И только затем полученное (это уже не массив) десериализовать.
Здравствуйте, Passerby, Вы писали:
P>Здравствуйте, Serginio1, Вы писали: S>> members чем является? P>В C# нет такого типа. S>> Не всегда. Еще раз пример массива. P>Не еще раз, а хотя бы один пример. S>> Ты можешь не десериализовать его полностью или через тот же IEnumerable считывая по одному элементу. P>Массив просто нельзя десериализовать. Это не последовательность символов. Массив можно только сериализовать. И только затем полученное (это уже не массив) десериализовать.
Ладно все понятно. Для информации напомню, что сейчас модно использовать Protocol Buffers
По сути являющейся базой данных. Объект может быть размазан по нескольким таблицам. Ты можешь получать объект из базы данных полность, или с отложенной загрузкой.
Опять же ты не считываешь все записи, а используя индекс считываешь нужный объект или можешь получать объекты порциями.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Passerby, Вы писали:
P>По ссылке "Преобразование строки в родной объект называется десериализацией (преобразование из последовательной формы в параллельную), в то время как преобразовании родного объекта в строку, таким образом ,чтобы он мог быть передан через сеть, называется сериализацией(преобразование в последовательную форму)." P>Что такое десериализация объекта?
Преобразование строки в родной объект называется десериализацией объекта из строки, а обратное действие ― сериализация объекта в строку.
Сериализуют что-то во что-то ― объект в xml/json/...
Десериализуют что-то из чего-то — объект из xml/json/...
Объект ― всегда прямое дополнение к глаголу, а хранилище — косвенное.
Здравствуйте, Passerby, Вы писали:
A>>Коллекции нет, а IEnumerable есть. 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;
}
}
Здравствуйте, alexzzzz, Вы писали: A>Перебирается конечно, но просто в цикле, без создания промежуточных коллекций. В этом и смысл.
Если без промежуточной коллекции, то для каждой итерации по-новому разбирается строка (предыдущий разбор нигде в промежуточной коллекции не сохранен).
Здравствуйте, 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;
}
}
Здравствуйте, alexzzzz, Вы писали:
В этих примерах вывод в консоль, так же сработает и для другого однократного получения результата. А если результат нужен, чтобы его программа несколько раз запрашивала, то десериализация строки в только либо в коллекцию и IEnumerable будет лишним, либо каждый раз вызывать парсить строку через IEnumerable, что еще хуже. Т.е. только два варианта, когда IEnumerable имеет смысл применять при десериализации: 1. Результат нужен только один раз в одном месте программы, 2. Строка очень большая и List не помещается в память или очень много памяти занимает.
Здравствуйте, Passerby, Вы писали:
P>Здравствуйте, alexzzzz, Вы писали: P>В этих примерах вывод в консоль, так же сработает и для другого однократного получения результата. А если результат нужен, чтобы его программа несколько раз запрашивала, то десериализация строки в только либо в коллекцию и IEnumerable будет лишним, либо каждый раз вызывать парсить строку через IEnumerable, что еще хуже. Т.е. только два варианта, когда IEnumerable имеет смысл применять при десериализации: 1. Результат нужен только один раз в одном месте программы, 2. Строка очень большая и List не помещается в память или очень много памяти занимает.
Общие затраты будут практически те же. Ну на MoveNext и Current миллиард вызовов в секунду. Дольше уходит на парсинг строк.
Можешь закачать куда угодно если заранее известно количество то конечно массив
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали: S> Общие затраты будут практически те же. Ну на MoveNext и Current миллиард вызовов в секунду. Дольше уходит на парсинг строк.
Так если не сделать сразу коллекцию, то каждый раз когда программе нужны будут данные с IEnumerable будет запускаться новый парсинг (если десериализатор не делает предварительно коллекцию и не кеширует ее). И даже если данные нужны только один раз, какой смысл в IEnumarable, если можно сразу в коллекцию? Только если строка длиннющая или может статься, что не все данные нужны, а только несколько первых, тогда IEnumarable. S>Можешь закачать куда угодно если заранее известно количество то конечно массив
Как информация о количестве может повлиять на скорость десериализации? Вместо List объявляется массив, в который десериализуется строка. После десериализации можно посмотреть Length. Скорость зависит от того как реализована десериализация в массив: сразу подсчитывается количество элементов и объявляется массив или сначала десериализуется в список, а потом ToArray(). Хотя и в случае десериализации сразу в массив не факт, что это будет быстрее, т.к. подсчет элементов это лишняя операция, а в случае списка просто добавляется следующий элемент, пока не кончится строка.
Здравствуйте, Passerby, Вы писали:
P>Здравствуйте, Serginio1, Вы писали: S>> Общие затраты будут практически те же. Ну на MoveNext и Current миллиард вызовов в секунду. Дольше уходит на парсинг строк. P>Так если не сделать сразу коллекцию, то каждый раз когда программе нужны будут данные с IEnumerable будет запускаться новый парсинг (если десериализатор не делает предварительно коллекцию и не кеширует ее). И даже если данные нужны только один раз, какой смысл в IEnumarable, если можно сразу в коллекцию? Только если строка длиннющая или может статься, что не все данные нужны, а только несколько первых, тогда IEnumarable. S>>Можешь закачать куда угодно если заранее известно количество то конечно массив P>Как информация о количестве может повлиять на скорость десериализации? Вместо List объявляется массив, в который десериализуется строка. После десериализации можно посмотреть Length. Скорость зависит от того как реализована десериализация в массив: сразу подсчитывается количество элементов и объявляется массив или сначала десериализуется в список, а потом ToArray(). Хотя и в случае десериализации сразу в массив не факт, что это будет быстрее, т.к. подсчет элементов это лишняя операция, а в случае списка просто добавляется следующий элемент, пока не кончится строка.
Ну всегда можешь сделать ToList или ToArray. Но если тебе нужен отбор по записям то память экономится. IEnumerable универсален.
и солнце б утром не вставало, когда бы не было меня