C# 使用LINQ和查询表达式语法进行聚合

C# 使用LINQ和查询表达式语法进行聚合,c#,.net,linq,linq-to-objects,C#,.net,Linq,Linq To Objects,编辑:我已经完全删除了我最初的问题,以更直接的方式重新表述它。如果这违反了任何礼节,我很抱歉,但我认为在同一主题上发布一个新的会更糟糕: 通过实现您自己的SelectMany或类似功能,是否可以使用查询理解语法编写此LINQ查询: var enumerable = Enumerable.Range(1, 10) .Aggregate(new SomeAggregation(), (c, n) =>

编辑:我已经完全删除了我最初的问题,以更直接的方式重新表述它。如果这违反了任何礼节,我很抱歉,但我认为在同一主题上发布一个新的会更糟糕:

通过实现您自己的SelectMany或类似功能,是否可以使用查询理解语法编写此LINQ查询:

var enumerable = 
    Enumerable.Range(1, 10)
              .Aggregate(new SomeAggregation(),
                         (c, n) =>
                         {
                             var l = c.SomeOperation(); // expensive operation
                             return c.UseIt(l).UseItAgain(l); // the result is needed multiple times
                         });
我的想法大致如下:

var enumerable = from c in new SomeAggregation().AsSeed()
                 from n in Enumerable.Range(1, 10)
                 from l in c.SomeOperation()
                 select c.UseIt(l).UseItAgain(l);
或:


非常感谢您的任何帮助、提示、链接等

在我看来,既然let的计算结果是调用Select,那么如果您实现一个LINQ风格的Select方法,这应该是可行的,类似于您已经实现的SelectMany方法,只是更简单而已。不过,我可能遗漏了一些东西。

在我看来,由于let的计算结果是调用Select,如果实现一个LINQ风格的Select方法(类似于您已经实现的SelectMany方法),这应该会起作用,只是更简单而已。不过,我可能遗漏了什么。

谢谢你的回答。我已经试过了,但问题是Select中的转换func只接受一个参数,因此无法在聚合器中发送。现在聚合器就在那里,它只是包装在一个匿名类型中,而这个匿名类型与我们想要返回的类型不同。我看不出如何克服这种类型的不匹配。@asgerhallas:我不完全理解你希望它做什么。您能否提供详细信息,说明在这种情况下,您希望let的行为如何?很抱歉,问题不清楚。我已经提供了使用let now的详细信息和结果行为:感谢您的回答。我已经试过了,但问题是Select中的转换func只接受一个参数,因此无法在聚合器中发送。现在聚合器就在那里,它只是包装在一个匿名类型中,而这个匿名类型与我们想要返回的类型不同。我看不出如何克服这种类型的不匹配。@asgerhallas:我不完全理解你希望它做什么。您能否提供详细信息,说明在这种情况下,您希望let的行为如何?很抱歉,问题不清楚。我已经提供了使用let now的详细信息和结果行为:可能会发布一个您想要编写的LINQ示例?很抱歉,问题不清楚。我现在已经更新了:也许发布一个你想写的LINQ的例子?很抱歉,问题不清楚。我现在已经更新了它:
var enumerable = from c in new SomeAggregation().AsSeed()
                 from n in Enumerable.Range(1, 10)
                 let l = c.SomeOperation()
                 select c.UseIt(l).UseItAgain(l);