Foreach/For loop альтернативная лямбда-функция?

Мы используем for или foreach для циклического просмотра коллекций и обработки каждой записи.

Есть ли альтернатива во всех этих новых лямбда-функциях для коллекций в С#?

Традиционный способ сделать

foreach(var v in vs)
{
  Console.write(v);
}

Есть ли что-нибудь вроде?

vs.foreach(v => console.write(v))

Ответы

Ответ 1

Список имеет метод ForEach, однако IEnumerable этого не делает.

В связи с этим есть ряд вопросов/ответов. Я думаю, что основная причина, по которой он не был реализован в IEnumerable, заключается в том, что Linq on Enumerables "означает" свободным, поскольку он является языком запросов.

Эрик Липперт объясняет свои мысли в своем блоге.

http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

Ответ 2

Да.

Из IList существует метод расширения ForEach:

Существует метод ForEach для списка:

List<string> list = new List<string>() { "1", "2", "3", "4" };

list.ForEach(s => Console.WriteLine(s));

Это то, что вы ищете?

Ответ 4

По умолчанию его нет.
Вы можете определить свой собственный:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) {  
   foreach(T val in source)  
      action(val);  
}

Ответ 5

Эрик делает убедительный аргумент, за исключением того факта, что существует ForEach для List <T> , но только для List <T> . Я использовал многочисленные случаи использования этого очень полезного метода расширения и был в равной степени разочарован отсутствием общего метода расширения для IEnumerable <T> , поэтому я, наконец, решил написать свой собственный.

Таким образом, я закончил тем, что сделал еще один шаг и написал свободно распространяемые методы расширения, которые позволяют chaing действий по каждому элементу и выполнение действия только один раз в этой цепочке, if ни по какой другой причине, поскольку в то время они казались хорошей идеей.

Здесь код:

public static class EnumerableExtensions
{   
   public static void ForEach<T>(this IEnumerable<T> collection, Action<T> action)
   {
      foreach (var item in collection)
      {
         action(item);
      }
   }

   public static IEnumerable<T> Once<T>(this IEnumerable<T> collection, 
      Func<IEnumerable<T>, bool> predicate, Action<IEnumerable<T>> action)
   {
      if (predicate(collection)) 
         action(collection);
      return collection;
   }

   public static IEnumerable<T> ForEvery<T>(this IEnumerable<T> collection,
      Func<T, bool> predicate, Action<T> action)
   {
      foreach (var item in collection)
      {
         if (predicate(item)) 
            action(item);
      }
      return collection;
   }
}

Вы можете найти пример кода использования на моем сообщении в блоге Расширить IEnumerable с помощью методов ForEach и Once.

Ответ 6

То, что вы написали, совершенно легально (кроме случая) - предполагая, что тип vs имеет ForEach, определенный как метод расширения, или если он List.

ForEach определяется для List<T>:

Выполняет указанное действие для каждого элемента List<T>.

Ответ 7

static void Main(string[] args)  
{
    int[] i = {1, 2, 3, 4, 5, 6, 7, 78, 8, 9};
    var data = i.ToList();

    data.ForEach(m => { Console.WriteLine(m); });

    Console.ReadKey();
}

Ответ 8

vs.ToList().ForEach(item => Console.WriteLine(item));

Ответ 9

.NET 3.5 Linq не имеет Foreach, хотя LinqBridge предоставил один. Я привык к использованию Linqbridge, что я, естественно, предполагается, является частью .NET 3.5 Framework

Просто добавьте его в коллекцию методов расширения, если вы считаете, что это может привести к ясности в вашей программе.

static class Helper
{
    public static IEnumerable<t> ForEeach<t>
        (this IEnumerable<t> source, Action<t> act)
    {
        foreach (T element in source) act(element);
        return source;
    }
}