1

是否LINQ有一个序列运算符,它允许对每个元素执行一些操作而不将其投影到新序列?

这可能看起来有点尴尬,但只是让我知道:)

例子:

IEnumerable<IDisposable> x;
x.PERFORM_ACTION_ON_EVERY_ELEMENT(m => m.Dispose());

显然,这可以使用类似的东西来完成:

foreach (var element in x) x.Dispose();

但是,如果确实存在某些东西,那就太好了。

4

4 回答 4

6

不,它不存在。特别是出于您提到的原因:拥有一个行为与其他所有操作完全不同的操作员似乎很尴尬。

C# 编译器开发人员之一 Eric Lippert有一篇关于此的文章。

但我们可以在这里更深入一点。我在哲学上反对提供这种方法,原因有两个。

第一个原因是这样做违反了所有其他序列运算符所基于的函数式编程原则。显然,调用此方法的唯一目的是引起副作用。

表达式的目的是计算一个值,而不是产生副作用。声明的目的是产生副作用。这个东西的调用点看起来很像一个表达式(虽然,不可否认,由于该方法是返回无效的,所以该表达式只能在“语句表达式”上下文中使用。)

制作一个唯一的仅对其副作用有用的序列运算符并不适合我。

于 2011-03-28T18:52:40.583 回答
4

您可以使用此方法:

public static class Extension
{
    public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> action)
    {
        foreach (var t in source)
        {
            action(t);
        }
        return source;
    }
}

它返回源,因此您可以根据需要将其传递给另一个扩展方法。或者如果你想作废,你可以稍微改变一下方法。

于 2011-03-28T18:52:02.487 回答
2

morelinq项目有一个操作ForEach。LINQ 本身没有,因为 LINQ 完全是关于函数式编程的,并且ForEach有副作用。

于 2011-03-28T18:51:40.023 回答
0

这是关于此Run a method on all objects in a collection的类似讨论

于 2011-03-28T18:57:37.543 回答