Семантика в стороне, быстрый тест показывает, что они НЕ эквивалентны!
Они делают задачу по-другому (или возможно, они делают различные задачи).
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
случаи.
Использование метода расширения 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
, но (теоретически) более эффективно, так как передает значения напрямую делегату.
Нет ничего встроенного, но вы можете легко создать для этого свой собственный метод расширения:
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);
}
}
Официальная строка MS: «потому что это не функциональная операция» (т.е. операция с отслеживанием состояния).
Не могли бы вы сделать что-то вроде:
list.Select( x => x+1 )
или если вам действительно нужно это в списке:
var someValues = new List<int>( list.Select( x => x+1 ) );
Классы 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);
}
Это позволит точному коду, который вы указали в своем вопросе, работать так, как вы хотите.
Расширение 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);
}
В стандартном Linq ничего подобного нет, но есть оператор ForEach в MoreLinq .