особливості поведінки IEnumerable ? Бо, скажімо, в MSDN згадок цього немає.
якщо чесно - хз, як бачиш люди тут самостійно пояснюють) є https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/iterators але він як русофобія - недостатній
IEnumerable скрывает реализацию под собой Эта реализация может иметь представление в памяти (как писал Арсений "коллекция элементов") А может иметь машину состояний (некий класс, который будет вычислять элементы последовательно по одному исходя из некой логики, логика отличается от метода до метода в linq) И главный поинт в том, что эта стейт машина не кэширует результат предыдущего прохода, она просто начинает вычислять элементы заново
І, оскільки таски в C# представлені як машини станів, IEnumerable не створив колекцію, так ?
Тут дело не в тасках Да, таски работают по схожему принципу
ще додам IEnumerable<T> потребує реалізації виключно IEnumerator<T> GetEnumerator(), де в свою чергу IEnumerator<T> потрібен задля своїх bool MoveNext() та T Current таким чином, коли в вас є абстрактний IEnumerable<T> то компілятор перетворює foreach (var item in enumerable) на using var enumerator = enumerable.GetEnumerator() while (enumerator.MoveNext() { var item = enumerator.Current; // foreach body }
На самом деле можно на аналогиях объяснить намного проще Итерация linq метода это примерно следующее Ты подошёл к автомату со снеками, купил одну штуку, отошёл в сторону и съел, затем вернулся и купил вторую штуку, затем снова отошёл и съел, и так далее А .ToList() на этом методе это ты подошёл сразу с корзинкой, купил все снеки по одному, и ушёл сразу со всеми При чём если ты потом попробуешь заново итерировать объект, то в первом случае ты снова будешь получать НОВЫЕ снеки из автомата, ведь он тебе те что ты уже получил - не выдаст снова А в случае с корзинкой, ты повторно переберешь те снеки, что у тебя были
ем а як він їй загрузить назад в автомат якщо він їх вже зїв
Ладно, не съел, просто отошёл этикетку почитать Читать её можно сколько угодно
Обсуждают сегодня