The advice of Eric Lippert не писать такие циклы, как выражения.
Используйте выражения запроса, если код не имеет побочных эффектов и создает значение.
В этом случае вы выполняете цикл, чтобы повторить инструкцию, которая имеет побочный эффект на консоли и не возвращает значения. Таким образом, цикл foreach более ясен и разработан специально для этой цели.
С другой стороны, действие (которое может иметь побочные эффекты) может рассматриваться как чистое значение до его исполнения. Так вот список номеров:
List<int> numbers = Enumerable.Range(1, 10).ToList();
Из того, что мы делаем список действий:
List<Action> actions = numbers.Select(n => Console.WriteLine(n)).ToList();
Хотя мы имеем дело с действиями, которые имеют побочные эффекты, мы на самом деле не запуская их в все, поэтому любые дальнейшие манипуляции с содержанием этого списка не являются побочными. Тогда, наконец, когда у нас есть список, нам нужно, мы можем использовать forloop для его выполнения:
foreach (var a in actions)
a();
И это такая простая модель, можно утверждать, что метод RunAll
расширения на IEnumerable<Action>
не будет плохо , В самом деле, в .NET Framework встроена эта концепция: делегат многоадресной рассылки - это одна вещь, которую вы можете назвать, которая выполняет кучу делегатов в списке. В наиболее распространенных случаях использования (событиях) эти делегаты имеют побочные эффекты.
Просто указывая, что работает только со списком (что имеет место в заданном вопросе), в то время как материал LINQ обычно работает с IEnumerable . –
Да, но поскольку для IENumerable нет эквивалента '', это должно быть довольно тривиально для реализации метода расширения для этого. –