Сразу оговорюсь: IEnumerable как бесплатное приложение к IList меня вполне устраивает.
Разница в том, что в случае с реальным енумератором можно не дожидатья окончания загрузки данных с сервера.
Т.е. классический пример распихивания деталей по заказам будет выглядеть так:
using (IEnumerator<Detail> details = Map.DataReaderToEnumerable<Detail>(readerDetail).GetEnumerator())
if (details.MoveNext())
{
foreach (Order order in Map.DataReaderToEnumerable<Order>(readerOrder))
{
while (details.Current.OrderId == order.Id)
{
order.Details.Add(details.Current);
if (!details.MoveNext())
{
break;
}
}
}
}
У нас в проекте есть пара мест, где клиенту приходит с сервера многомерный массив float'ов (c дырками), в виде
index1, index2, .... indexN, value
index1, index2, .... indexN, value
Который раскладывается в реальный массив, т.е. данные получаемые с сервера ну совсем не похожи на те,
что используются внутри программы. Вот тут IEnumerable очень к месту — получили IDataReader с сервера,
поматросили и сразу бросили.
Здравствуйте, Блудов Павел, Вы писали:
БП>Который раскладывается в реальный массив, т.е. данные получаемые с сервера ну совсем не похожи на те, БП>что используются внутри программы. Вот тут IEnumerable очень к месту — получили IDataReader с сервера, БП>поматросили и сразу бросили.
Про поматросил и забросил понял, про что надо сделать не уверен
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, Блудов Павел, Вы писали:
IT>>Про поматросил и забросил понял, про что надо сделать не уверен
БП>Т.е. уверен что не надо делать? А почему? Какие-то неочевидные грабли могут обьявиться?
Я не совсем понял что именно надо сделать.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Я не совсем понял что именно надо сделать.
Поменять list.Add() на yeld return. Давай я сам прикину как это можно сделать,
и если у меня что-то получится без тотального переделывания всего и вся, я сюда
закину список изменений.
Здравствуйте, Блудов Павел, Вы писали:
БП>и если у меня что-то получится без тотального переделывания всего и вся, я сюда БП>закину список изменений.
Получилось только превращением функции MapSourceListToDestinationList в объект, с розрушением всего и вся.
Зато мне пришла в голову идея получше. Всё тоже самое можно сделать через делегаты.
public delegate void MapDelegate<T>(T o);
public static class Map
{
public static void EnumerateDataReader<T>(IDataReader reader, MapDelegate<T> td)
{
// you know
}
}
Я добавил виртуальные методы для создания различных типов мапперов, в том числе CreateDataReaderMapper в котором можно вернуть свою реализацию DataReaderMapper. Такой вариант не устроит?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Я добавил виртуальные методы для создания различных типов мапперов, в том числе CreateDataReaderMapper в котором можно вернуть свою реализацию DataReaderMapper. Такой вариант не устроит?