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
,必须传递一个数组。。但在更改时忘了更新