Using the ToList() extension method is your best option:
someValues.ToList().ForEach(x => list.Add(x + 1));
There is no extension method in the BCL that implements ForEach directly.
Although there's no extension method in the BCL that does this, there is still an option in the System
namespace... if you add Reactive Extensions to your project:
using System.Reactive.Linq;
someValues.ToObservable().Subscribe(x => list.Add(x + 1));
This has the same end result as the above use of ToList
, but is (in theory) more efficient, because it streams the values directly to the delegate.
The Array
and List<T>
classes already have ForEach
methods, though only this specific implementation. (Note that the former is static
, by the way).
Not sure it really offers a great advantage over a foreach
statement, but you could write an extension method to do the job for all IEnumerable<T>
objects.
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (var item in source)
action(item);
}
This would allow the exact code you posted in your question to work just as you want.
There isn't anything built-in, but you can easily create your own extension method to do it:
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);
}
}
The official MS line is "because it's not a functional operation" (ie it's a stateful operation).
Couldn't you do something like:
list.Select( x => x+1 )
or if you really need it in a List:
var someValues = new List<int>( list.Select( x => x+1 ) );
There isn't anything like that in standard Linq, but there is a ForEach operator in MoreLinq.
There is no Linq ForEach extension. However, the List
class has a ForEach method on it, if you're willing to use the List
directly.
For what it's worth, the standard foreach
syntax will give you the results you want and it's probably easier to read:
foreach (var x in someValues)
{
list.Add(x + 1);
}
If you're adamant you want an Linq style extension. it's trivial to implement this yourself.
public static void ForEach<T>(this IEnumerable<T> @this, Action<T> action)
{
foreach (var x in @this)
action(x);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With