0

ReSharper 在此代码上说“IEnumerable 的可能多重枚举”:

public static IEnumerable<T> Each<T>(this IEnumerable<T> @this, Action<T> action)
{
    foreach (var i in @this)
        action(i);

    return @this;
}

但我只是返回@this,我没有对它做任何其他事情......它是否警告我一旦函数返回,可能会进行额外的枚举,或者我在这里遗漏了一些东西?

4

2 回答 2

3

但我只是返回@this,我不做任何其他事情......

是的,但调用者可能还会枚举它......

无论如何,像您在答案中所做的那样使用迭代器块会更好,因为:

  • 它避免了多次枚举
  • 它保持延迟执行(即在您开始枚举 的结果之前不会枚举源序列Each
于 2013-04-21T12:00:48.860 回答
1

这避免了警告,我认为它更有效:

public static IEnumerable<T> Each<T>(this IEnumerable<T> @this, Action<T> action)
{
    foreach (var i in @this)
    {
        action(i);
        yield return i;
    }
}

有人可以验证它确实更有效(不枚举两次?)?

于 2013-04-21T11:33:33.830 回答