在LINQ查询中将当前项目提供给下一项

时间:2013-06-27 13:36:04

标签: c# linq functional-programming

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

以下......

object[] A;

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

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

如何将LINQ查询中第一项Select()的结果提供给第二项的Select()

我知道我可以使用for循环来完成此任务,但我想知道是否有更多功能方法来处理这类问题。必须有功能样式语言的解决方案,如F#,我想知道我是否可以将其转换为C#中的LINQ解决方案。单线解决方案尤其令人敬畏。

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

2 个答案:

答案 0 :(得分:1)

尝试.Aggregate()

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

我不会保证我有正确的语法,特别是对于你的代码。但是,这个想法应该很清楚,如果你在一个更全面的例子中进行编辑,我可以扩展它。

答案 1 :(得分:1)

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

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

有关C#中Scan扩展方法的实现,请参阅this question。鉴于该方法,您可以像这样实现您的查询:

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

虽然不能想到Scan方法的优雅单行实现。