1

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

以下....

object[] A;

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

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

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

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

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

4

2 回答 2

1

试试.Aggregate()

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

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

于 2013-06-27T13:52:23.930 回答
1

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

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

有关C# 中扩展方法的实现,请参阅此问题。Scan给定该方法,您可以像这样实现您的查询:

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

不过,想不出该Scan方法的优雅单行实现。

于 2013-06-27T13:52:39.120 回答