Выполнить действие <T>по IEnumerable Характеристики? - PullRequest
1 голос
/ 29 марта 2012

У меня есть этот код:

 int[] g = new int[3] { 1, 2, 3 };
 g.ToList().ForEach(f=>Console.Write(f));

Для каждого элемента в массиве я хочу выполнить Action ....

int[] уже Реализация Ienumerable.

Я хотел бы выполнить Действие без "ToList()"

. Есть ли какое-либо другое решение (с одной строкой кода) сделать это (без toList? т.е. используя его IEnumerable характеристики)

Ответы [ 3 ]

8 голосов
/ 29 марта 2012

Вы можете использовать Array.ForEach вместо:

Array.ForEach(g, f => Console.Write(f));

или даже 1 :

Array.ForEach(g, Console.Write);

Лично я бы, наверное,используйте вместо этого цикл foreach по причинам, указанным Эриком Липпертом ...


1 Если он компилируется.Я прекратил пытаться предсказать, будет ли преобразование группы методов работать в контексте вывода общего типа.

1 голос
/ 29 марта 2012

ForEach() - это метод класса List, а не интерфейса IEnumerable, поэтому он не будет доступен для массива напрямую.

Если вы настойчиво делаете одну строку кода и IEnumerable, вы можете использовать (или злоупотреблять) метод, такой как Any() или All(), и выполнить желаемую операцию (в данном случае печать) перед возвратом. соответствующее значение, которое приведет к продолжению итерации.

Или вместо этого вы можете использовать Array.ForEach().

0 голосов
/ 11 сентября 2014

Вдохновленный Джоном Скитом, вот полезный метод расширения, который я написал:

Клиент:

var jobs = new List<Job>() 
    { 
        new Job { Id = "XAML Developer" }, 
        new Job { Id = "Assassin" }, 
        new Job { Id = "Narco Trafficker" }
    };
jobs.Execute(ApplyFilter, j => j.Id);

public void ApplyFilter(string filterId) { }

Метод расширения:

    public static void Execute<TSource, TKey>(this IEnumerable<TSource> source, Action<TKey> applyBehavior, Func<TSource, TKey> keySelector)
    {
        foreach (var item in source)
        {
            var target = keySelector(item);
            applyBehavior(target);
        }
    }
...