帮助将foreach转换为Linq

时间:2009-11-23 09:54:55

标签: linq

这是一个家庭作业问题。

我正在对我们的域模型进行差异处理,并且我已经设置了它,以便我可以迭代检查域内的certian差异的操作列表。我传入差异函数以及对象图的前后状态,以在DiffContext中生成结果 - 稍后用于设置调用另一个服务的有效负载。但我做了一些更改,需要Linq语法的帮助

所以,我有以下代码......

public static IEnumerable<DiffContext> GetFirstDifference<T>(IEnumerable<Func<T, T, DiffContext>> diffOperations, T beforeState, T afterState)
{
    return from op in diffOperations
           let diff = op(beforeState, afterState)
           where diff.FoundDifference
           select diff;
}

我修改了使用Func<T, T, IEnumerable<DiffContext>>而不是之前的Func<T, T, DiffContext> - 因为现在我的差异操作可以返回多个差异。像这样......

public static IEnumerable<DiffContext> GetFirstDifference<T>(IEnumerable<Func<T, T, IEnumerable<DiffContext>>> diffOperations, T beforeState, T afterState)
{
    foreach (var op in diffOperations)
    {
        foreach (var diff in op(beforeState, afterState))
        {
            yield return diff;
        }
    }
}

但是现在我有了这个嵌套的foreach,我想帮助将它转换为Linq等价物。你能帮忙吗?

感谢Jon Skeet。我现在有以下代替嵌套的foreach:

    return from op in diffOperations
           from diff in op(beforeState, afterState)
           where diff.FoundDifference
           select diff;

1 个答案:

答案 0 :(得分:4)

是的 - 基本上你想要two "from" clauses - 执行展平操作。这使用SelectMany LINQ运算符。

鉴于这是家庭作业,我不愿意发布完整代码 - 但我会说这是一个三行LINQ查询(使用自然换行)。想想你想从“每个系列”中得到什么......

如果这还不够,请添加评论。