создаётся, а будут создаваться её элементы по мере необходимости. Но правильно ли я понимаю, что если использовать linq-запросы c условиями, то вся выгода от использования yield return пропадает, т.к. linq-запрос проверит все элементы коллекции? А если таких запросов будет много, то это вообще ещё хуже, чем работа с обычной коллекцией?
зависит от запросов
> это вообще ещё хуже, чем работа с обычной коллекцией Почему хуже? Так писать часто удобнее.
where(x=x.surname.Contains("-"))? к примеру). я не от таких запросах, которым нужны первые n-элементов и т.д. а которые будет полностью итерировать. размер тут думаю просто, если он небольшой, то это значения не имеет для памяти.
Ну в памяти он их сразу не создаст же, так что по памяти в любом случае будет выигрыш, нет?
вот тут я немного недопонимаю механизм работы, при обращении, в памяти не создаётся промежуточная коллекция? а при повторном ещё одна? или при обращении сразу идёт дублирование в переменную, для которой был вызван запрос?
Непонятно, что Вы имеете в виду под обращением Если у Вас enumerable.where().toList, то изначальный enumerable, если там yield, не будет в память весь помещён
под обращением, как раз имею ввиду enumerable.where().toList
ToList материализует вашу коллекцию.
Ну вот тут при вызове tolist он материализует всё в память, один раз
понятно тогда, а при последующих других enumerable.where().toList, он уже берёт из памяти значит
Вот задача, у вас есть сериализованная в файл коллекция, очень большая. Которая точно не поместится в памяти. Вам нужно её провалидировать и сохранить в базу только те объекты, которые валидны. Ваши действия?
Нет) Если Вы enumerable.where.toList положили в переменную - то обращение к переменной будет из памяти Если снова вызвать enumerable.where.tolist, то всё заново будет выполнено
Ваша задача аналогична моему вопросу), если мы по такому файлу пройдёмся linq-запросом через stream, то будет ли выгода от yield в данном случае.
Дат. Материализовать-то мы её не можем)
Каждый yield return будет вызыватся при MoveNext()
Linq в основном ленивый, то есть, работает при каждом вызове MoveNext()
Обсуждают сегодня