5

我已经实现了这个扩展方法:

public static IEnumerable<T> DoForEach<T>(this IEnumerable<T> data, Action<T> action)
{
    foreach (T value in data)
    {
        action(value);
        yield return value;
    }
}

当我做

output.DoForEach<string>(c => Console.WriteLine(c));

没有任何东西写入控制台。任何想法为什么这不起作用?谢谢

4

2 回答 2

8

yield return使您查询惰性,换句话说,您的方法仅在您开始迭代元素时执行。很多 LINQ 操作符在deferred fashion时会被执行。下一个代码演示了这个问题

new[] {1,2}.DoForEach(Console.WriteLine).ToList();

印刷:

1
2

尽管

new[] {1,2}.DoForEach(Console.WriteLine);

什么都不打印

举个完整的例子,检查下一个片段:

IEnumerable items = new[] {1,2}.DoForEach(s => Console.WriteLine("inside query:"+s));

foreach (var item in items)
{
    Console.WriteLine ("inside loop:" + item);
}

这将打印

inside query:1
inside loop:1
inside query:2
inside loop:2

它只会在第foreach一次迭代时开始打印。构建查询时不打印任何元素

于 2013-05-05T20:17:24.600 回答
6

这是因为您正在返回一个迭代器,但没有执行它。鉴于您所写的内容,您希望对列表执行一项操作,而不是从中获取枚举数,因此看起来您需要让 DoForEach() 函数返回 void,并在它。这应该将您的输出写入控制台。

编辑:这是一个显示我的意思的片段:

    public static void DoForEach<T>(this IEnumerable<T> data, Action<T> action)
    {
        foreach (T value in data)
        {
            action(value);
        }
    }
于 2013-05-05T20:16:54.413 回答