我有一个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#中执行此操作?
答案 0 :(得分:0)
我改变了以下内容,现在可以使用了。
FluentNode result = nodes.Aggregate (
dialog,
(FluentNode memo, WriteNode writeNode) => {
return memo * writeNode;
}
);