Linq разрабатывают “Для Каждый” [дубликат]

Семантика в стороне, быстрый тест показывает, что они НЕ эквивалентны!
Они делают задачу по-другому (или возможно, они делают различные задачи).

x=-2.5 (int)x=-2 Convert.ToInt32(x)=-2
x=-1.5 (int)x=-1 Convert.ToInt32(x)=-2
x=-0.5 (int)x= 0 Convert.ToInt32(x)= 0
x= 0.5 (int)x= 0 Convert.ToInt32(x)= 0
x= 1.5 (int)x= 1 Convert.ToInt32(x)= 2
x= 2.5 (int)x= 2 Convert.ToInt32(x)= 2

Уведомление x=-1.5 и x=1.5 случаи.

182
задан Community 23 May 2017 в 02:26
поделиться

6 ответов

Использование метода расширения ToList () - ваш лучший вариант:

someValues.ToList().ForEach(x => list.Add(x + 1));

В BCL нет метода расширения, который напрямую реализует ForEach.


Хотя метод расширения отсутствует в ] BCL , который делает это, там по-прежнему является параметром в пространстве имен System ... если вы добавите в свой проект Reactive Extensions :

using System.Reactive.Linq;

someValues.ToObservable().Subscribe(x => list.Add(x + 1));

Это имеет тот же конечный результат, что и вышеупомянутое использование ToList , но (теоретически) более эффективно, так как передает значения напрямую делегату.

264
ответ дан 23 November 2019 в 06:04
поделиться

Нет ничего встроенного, но вы можете легко создать для этого свой собственный метод расширения:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    if (source == null) throw new ArgumentNullException("source");
    if (action == null) throw new ArgumentNullException("action");

    foreach (T item in source)
    {
        action(item);
    }
}
31
ответ дан 23 November 2019 в 06:04
поделиться

Официальная строка MS: «потому что это не функциональная операция» (т.е. операция с отслеживанием состояния).

Не могли бы вы сделать что-то вроде:

list.Select( x => x+1 )

или если вам действительно нужно это в списке:

var someValues = new List<int>( list.Select( x => x+1 ) );
18
ответ дан 23 November 2019 в 06:04
поделиться

Классы Array и List уже имеют методы ForEach , но только в этой конкретной реализации. (Обратите внимание, что первый - static , кстати.)

Не уверен, что он действительно дает большое преимущество перед оператором foreach , но вы можете написать метод расширения, чтобы задание для всех объектов IEnumerable .

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

Это позволит точному коду, который вы указали в своем вопросе, работать так, как вы хотите.

95
ответ дан 23 November 2019 в 06:04
поделиться

Расширение Linq ForEach отсутствует. Однако в классе List есть метод ForEach, если вы хотите напрямую использовать List .

Для чего нужен стандартный foreach синтаксис даст вам желаемый результат, и его, вероятно, легче читать:

foreach (var x in someValues)
{
    list.Add(x + 1);
}

Если вы непреклонны, вам нужно расширение стиля Linq. это тривиально реализовать самостоятельно.

public static void ForEach<T>(this IEnumerable<T> @this, Action<T> action)
{
   foreach (var x in @this)
      action(x);
}
4
ответ дан 23 November 2019 в 06:04
поделиться

В стандартном Linq ничего подобного нет, но есть оператор ForEach в MoreLinq .

3
ответ дан 23 November 2019 в 06:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: