Методы List.ForEach и интерфейсы коллекции - PullRequest
3 голосов
/ 03 июня 2010

В .NET 3.5 List <> используется метод ForEach. Я заметил, что это не существует в IList <> или IEnumerable <> о чем здесь думали? Есть ли другой способ сделать это? Хороший и простой короткий способ сделать это?

Я спрашиваю, потому что я был на беседе, где оратор всегда использовал более общие интерфейсы. Но зачем мне использовать IList <> в качестве возвращаемого типа, если я хочу иметь возможность развернуться и использовать ForEach? Тогда я бы просто бросил его обратно в Список <>.

Ответы [ 3 ]

4 голосов
/ 03 июня 2010

о чем здесь думали?

Вы можете прочитать блог Эрика Липперта по причинам, по которым эта функция не была добавлена.

Есть ли другой способ сделать это? Хороший и простой короткий способ сделать это?

Почему бы просто не использовать ключевое слово foreach? Я нахожу это более читабельным.

foreach (var foo in ilist)
{
    // etc...
}

Хотя вы можете добавить ForEach метод расширения к IEnumerable<T>, если хотите:

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

Взято из здесь .

1 голос
/ 03 июня 2010

Почему ForEach не в IEnumerable<T>? Эрик Липперт хорошо объясняет это в своем блоге . По сути, LINQ предназначен для работы (без побочных эффектов), а ForEach явно не работает.

Но почему это не в IList<T>? Ну ... это должно быть !

1 голос
/ 03 июня 2010

Это не в фреймворке (пока), но Rx добавляет метод расширения .Run (этот IEnumerable enumerable), который делает то же самое, что и пользовательский ForEach в List. Пока это не является частью стандартной структуры, вам придется написать свою собственную или использовать дополнительную зависимость.

...