自定义 foreach 中的收益回报未按预期工作

Xar*_*ord 0 c# yield

我有一个重写的SaveChangesAsyncEF 方法,如下所示:

    public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
    {
        ChangeTracker
            .Entries()
            .Where(e => e.State == EntityState.Added)
            .Select(e => e.Entity as BaseEntity)
            .ForEach(e => e.ModifiedOn = e.CreatedOn = DateTimeOffset.Now);

        return base.SaveChangesAsync(cancellationToken);
    }
Run Code Online (Sandbox Code Playgroud)

BaseEntity也是我的类,具有一些常见属性,例如CreatedOn每个实体都继承自该类。这个重写的方法使用我自己的ForEach扩展:

    public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
    {
        foreach (var item in enumerable)
        {
            action(item);
            yield return item;
        }
    }
Run Code Online (Sandbox Code Playgroud)

当有yield语句时,foreach循环不会执行。如果我把它改成这样:

    public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
    {
        foreach (var item in enumerable)
        {
            action(item);
        }

        return enumerable;
    }
Run Code Online (Sandbox Code Playgroud)

然后就可以完美运行了。为什么yield 在这次迭代中没有执行它?

Jac*_*esB 5

延期执行。该代码在您消耗生成的项目时执行,例如。通过循环结果或调用.ToList()它。在您的代码示例中,您似乎从不消耗迭代的结果,因此它永远不会执行。