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));
Это то, что вы ищете?
Ответ 3
List(T).ForEach
делает именно это.
Ответ 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;
}
}