C# 混合LINQ和async(从种子获取有效负载)

C# 混合LINQ和async(从种子获取有效负载),c#,.net,linq,async-await,system.reactive,C#,.net,Linq,Async Await,System.reactive,我收集了一些种子 var seeds = new [] {1, 2, 3, 4}; 我希望从每个种子运行一个异步方法,该方法使用种子执行一些计算: async Task<int> Calculation(int seed); 不幸的是,不允许使用LINQ使用这种语法 如何使“results”变量同时包含种子和计算 (我希望得到任何答案,但特别是如果它使用System.Reactive的Observable)更改异步函数以返回计算的数字和给定的种子: public static a

我收集了一些种子

var seeds = new [] {1, 2, 3, 4};
我希望从每个种子运行一个异步方法,该方法使用种子执行一些计算:

async Task<int> Calculation(int seed);
不幸的是,不允许使用LINQ使用这种语法

如何使“results”变量同时包含种子和计算


(我希望得到任何答案,但特别是如果它使用System.Reactive的
Observable

更改异步函数以返回计算的数字和给定的
种子

public static async Task<Output> Calculation(int seed)
{
    return new Output { Seed = seed, Result = 0 };
}

public class Output
{
    public int Seed { get; set; }
    public int Result { get; set; }
}

更改异步函数以返回计算的数字和给定的种子:

public static async Task<Output> Calculation(int seed)
{
    return new Output { Seed = seed, Result = 0 };
}

public class Output
{
    public int Seed { get; set; }
    public int Result { get; set; }
}

您可以使用静态方法执行以下操作:

var r= await Task.WhenAll(seeds.Select(async seed =>new {
                                                          Seed= seed,
                                                          Result = await Calculation(seed) 
                                                        }
                                      )
                         );  

您可以使用静态方法执行以下操作:

var r= await Task.WhenAll(seeds.Select(async seed =>new {
                                                          Seed= seed,
                                                          Result = await Calculation(seed) 
                                                        }
                                      )
                         );  
以下是一个Rx解决方案:

var seeds = new [] {1, 2, 3, 4};
var results = Observable.ToObservable(seeds)
    .SelectMany(async i => new { seed = i, calculation = await Calculation(i)})
    .ToEnumerable();
以下是一个Rx解决方案:

var seeds = new [] {1, 2, 3, 4};
var results = Observable.ToObservable(seeds)
    .SelectMany(async i => new { seed = i, calculation = await Calculation(i)})
    .ToEnumerable();

这是斯蒂芬·克利里的回答,关于它。下面是Stephen Cleary对此的回答。没有理由在这里使用
任务。请运行
。您好@Servy,感谢您指出,我上次的更新是否正确?您也可以将语句lambda替换为表达式lambda,只需内联计算调用,就可以大大简化代码。格式也…不理想。你抓到我这么做;)没有理由在这里使用
Task。请运行
。您好@Servy,感谢您指出,我上次的更新是否正确?您也可以用表达式lambda替换语句lambda,只需内联计算调用,就可以将代码简化一点。格式也…不理想。你抓到我这么做;)
当所有的
都有一个重载,它接受一个可枚举的
,不需要调用ToArray()@ScottChamberlain-你是对的:)谢谢:)修复了它。最初我使用的是
WaitAll
,必须传递一个数组。。但是忘记了更新,当所有的
都有一个重载,这个重载接受了一个可枚举的
,不需要调用ToArray()@ScottChamberlain-你是对的:)谢谢:)修复了它。最初我使用的是
WaitAll
,必须传递一个数组。。但在更改时忘了更新