【问题标题】:Feeding current item into next item in LINQ query将当前项目馈送到 LINQ 查询中的下一个项目
【发布时间】:2014-07-24 21:13:26
【问题描述】:

我有一组要转换的项目(基本上,包含在元数据中)。对于集合中的第一个项目,我只需将必要的元数据包装在项目周围,就完成了。第二项的元数据依赖于前一项的元数据,所以我想将第一项的元数据传递给第二项。

以下....

object[] A;

A.skip(1)
 .Zip( A, (first, second), a => new Metadata( first, second ) );

...不起作用,因为它使用object 作为第二个输入而不是Metadata。到目前为止我见过的所有其他解决方案都是如此(传递原始对象,而不是 Select() 函数的结果)。

如何将我的 LINQ 查询中第一项的 Select() 的结果输入到第二项的 Select() 中?

我知道我可以使用for 循环来完成此操作,但我想知道是否没有更实用的方法来处理此类问题。 F# 等函数式语言必须有一个解决方案,我想知道是否可以将其转换为 C# 中的 LINQ 解决方案。单线解决方案会特别棒。

通过像这样将元数据链接在一起,我可以将重要信息从一个项目传递到以下所有项目,例如标志或上下文。归根结底,我们的目标不仅仅是了解前一个项目,而是了解当前项目的整个上下文。然后,当前项目可以更改所有后续项目的上下文等。

【问题讨论】:

    标签: c# linq functional-programming


    【解决方案1】:

    试试.Aggregate()

    var data = A.Aggregate(new Metadata(null, A), (meta, a) => new Metadata(meta, a));
    

    我不保证我拥有该权利的语法,尤其是您的代码。不过,这个想法应该很清楚,如果您在更详尽的示例中进行编辑,我可以对此进行扩展。

    【讨论】:

    • 我认为这是对的,只是它只会产生序列的最后一个值。
    • @MisterMetaphor - 其中有another version,它需要一个额外的参数来让函数产生结果。这可能是所需要的。另外,感谢您关注Accumulate -> Aggregate。我总是这样做。
    • 您可以从方法签名中看到它也返回单个值。我可能弄错了,但我认为 OP 正试图获取一系列项目。
    • @MisterMetaphor - 你是对的......我应该在我的问题中更清楚地说明这一点。
    【解决方案2】:

    这种行为通常通过scan 或函数式编程语言中的类似函数来完成。在 F# 中,您可以这样做:

    originalSequence |> Seq.scan (fun (prev, current) -> Some <| new Metadata( (* ... stuff ... *) )) None
    

    请参阅this question,了解 C# 中 Scan 扩展方法的实现。给定该方法,您可以像这样实现您的查询:

    A.Scan((previous, current) => new Metadata(/* ... */), null)
    

    但想不出Scan 方法的优雅单行实现。

    【讨论】:

    猜你喜欢
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2010-09-20
    • 2014-08-25
    • 1970-01-01
    相关资源
    最近更新 更多