Foreach с методом расширения на IEnumerable - PullRequest
5 голосов
/ 09 декабря 2011

Быстрый вопрос, см. Этот код:

List<int> result = new List<int>();

var list = new List<int> { 1, 2, 3, 4 };

list.Select(value =>
    {
        result.Add(value);//Does not work??
        return value;
    });

И:

result.Count == 0 //true

Почему result.Add (значение) не выполнено?

Однако это не выполнено, Другой вопрос, который может сделать foreach на IEnumerable с Метод расширения ?

Кроме этого способа: IEnumerable.ToList().Foreach(p=>...)

Ответы [ 3 ]

17 голосов
/ 09 декабря 2011

Почему result.Add (значение) не выполняется?

Это потому, что LINQ использует отложенное выполнение.Пока вы на самом деле не перечислите результаты (возврат Select), делегаты не будут выполняться.

Для демонстрации попробуйте следующее:

List<int> result = new List<int>();

var list = new List<int> { 1, 2, 3, 4 };

var results = list.Select(value =>
    {
        result.Add(value);//Does not work??
        return value;
    });

foreach(var item in results)
{
     // Just iterating through this will cause the above to execute...
}

При этом это плохая идея .Запросы LINQ не должны иметь побочных эффектов, если вы можете их избежать.Подумайте о Select как о способе преобразования ваших данных, а не о выполнении кода.

Однако это не выполнено. Еще один вопрос, как сделать метод foreach для IEnumerable с помощью метода расширения?*

Вы можете написать свой собственный метод расширения:

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

Однако я бы не советовал этого делать.За подробностями обращайтесь к сообщению Эрика Липперта по теме .

3 голосов
/ 09 декабря 2011

Выбор ленив, и выполнение откладывается до тех пор, пока вы не начнете перечислять результаты. Вам нужно использовать набор результатов, вызвав, например, .ToArray или зациклив результат:

list.Select(value =>
    {
        result.Add(value);//Does not work??
        return value;
    }).ToArray();
0 голосов
/ 09 декабря 2011
List<int> result = new List<int>();
var list = new List<int> { 1, 2, 3, 4 };
list.ForEach(delegate(int sValue)
{
    result.Add(sValue);
});

Это работает, но все и добавляет 1 2 3 4 в результат. Проверьте это. Я только что сделал.

...