我有一组我想要转换的项目(基本上是包装元数据)。对于集合中的第一个项目,我只需在项目周围包含必要的元数据,我就完成了。第二项的元数据取决于前一项的元数据,因此我想将第一项的元数据传递给第二项。
以下......
object[] A;
A.skip(1)
.Zip( A, (first, second), a => new Metadata( first, second ) );
...无效,因为它使用object
作为第二个输入而不是Metadata
。对于我到目前为止看到的每个其他解决方案都是如此(传递原始对象,而不是Select()
函数的结果)。
如何将LINQ查询中第一项Select()
的结果提供给第二项的Select()
?
我知道我可以使用for
循环来完成此任务,但我想知道是否有更多功能方法来处理这类问题。必须有功能样式语言的解决方案,如F#,我想知道我是否可以将其转换为C#中的LINQ解决方案。单线解决方案尤其令人敬畏。
通过将元数据链接在一起,我可以将重要信息从一个项目传递到以下所有项目,例如标志或上下文。最终,目标不仅仅是了解前一个项目,而是了解当前项目的整个上下文。然后,当前项可以更改所有后续项的上下文等。
答案 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
方法的优雅单行实现。