C#聚合备忘录的初始值

时间:2018-03-11 20:42:21

标签: c# linq

我有一个WriteNode个对象的列表。我需要在列表的开头插入一个不同类型的对象,并将它们全部复用。

程序上看起来像这样:

FluentNode dialog = Show();
WriteNode write1 = Write(0, "hello");
WriteNode write2 = Write(0, "world");

FluentNode result = Show() * write1 * write2;

现在我想以编程方式更多地做到这一点。

我在列表中有这些短语:

List<string> phrases = new List<string> { "hello", "world" };

我在列表上进行映射以获取WriteNode个对象的列表:

IEnumerable<WriteNode> nodes = phrases.Select ((string phrase) => {
        return Write (0, phrase);
})

目前我有以下reduce函数将它们相乘:

WriteNode writeNode = nodes.Aggregate ((WriteNode a, WriteNode b) => {
    return (WriteNode)( (WriteNode)a * (WriteNode)b );
});
FluentNode result = dialog * writeNode;

但是这不能按预期工作,因为我需要列表中的第一个元素是dialog对象。基本上,这个库会对*运算符的重载方式不同,具体取决于列表中的第一个项目。因此,如果我的理解是正确的,那么dialog * write1 * write2应该有效,而dialog * (write1 * write2)则不然。

这似乎是减少/&#34;累积器&#34;功能应该能够处理......有没有办法可以通过&#34;起点&#34;备忘录?在红宝石中它会是这样的:

# dialog is the starting value for memo
[word1, word2].reduce(dialog) { |memo, word| memo * word }

在Javascript中:

[word1, word2].reduce( (memo, word) => { return memo * word }, dialog)

你明白了。有没有办法在使用Linq或其他库的C#中执行此操作?

1 个答案:

答案 0 :(得分:0)

我改变了以下内容,现在可以使用了。

FluentNode result = nodes.Aggregate (
    dialog,
    (FluentNode memo, WriteNode writeNode) => {
        return memo * writeNode;
    }
);