我有代码
Enumerable.Range(100, 100)
.Select(x => x / 10)
有没有办法可以通过这条线。选择(x => x / 10)到一个方法。目的是在选择发生时将结果传递给方法。我想在这里避免使用foreach。
答案 0 :(得分:5)
您可以编写自己的扩展方法,在每个项目通过时执行操作:
public static IEnumerable<T> WithAction<T>(this IEnumerable<T> source,
Action<T> action)
{
foreach (T item in source)
{
action(item);
yield return item;
}
}
然后,根据您是想对原始值还是预期值进行操作,您需要写下:
Enumerable.Range(100, 100)
.Select(x => x / 10)
.WithAction(x => Console.WriteLine(x))
或
Enumerable.Range(100, 100)
.WithAction(x => Console.WriteLine(x))
.Select(x => x / 10)
这使它独立于Select
本身。如果你需要它来使用投影,你可能会写一些类似的东西:
public static IEnumerable<TResult> SelectAndAct<TSource, TResult>
(this IEnumerable<TSource> source,
Func<TSource, TResult> projection,
Action<TSource, TResult> action)
{
foreach (TSource item in source)
{
TResult result = projection(item);
action(item, result);
yield return result;
}
}
然后:
Enumerable.Range(100, 100)
.SelectAndAct(x => x / 10,
(x, y) => Console.WriteLine("Was: {0}; Now: {1}", x, y))
请注意,所有这些都违反了LINQ的正常意图,即无副作用。在查询中产生副作用通常不是 一个好主意...但当然每条规则都有例外情况:)
答案 1 :(得分:2)
如果您的意思是推模型,可以使用:
.Select(x => MyMethod(x / 10))
答案 2 :(得分:1)
Enumerable.Range(100, 100)
.Select(x => { var r = x / 10; foo(r); return r; })
如果你不想消费结果,你真的应该使用foreach:
foreach (var x in Enumerable.Range(100, 100))
{
foo(x / 10);
}