C# 按组合并为单个组的任务

C# 按组合并为单个组的任务,c#,.net,task,.net-4.5,async-await,C#,.net,Task,.net 4.5,Async Await,假设所有类都实现了IGenerator List<IGenerator> generators = new List<IGenerator> { new Jane1Generator(), new Jane2Generator(), new JohnGenerator() }; 因此,如果我创建一个List tasks=newlist() 我希望tasks列表只包含两个元素。一个是Jane1和Jane2的联合任务,另一个是John,这样我就可以做了 await Ta

假设所有类都实现了
IGenerator

List<IGenerator> generators = new List<IGenerator> { new Jane1Generator(), new Jane2Generator(), new JohnGenerator() };
因此,如果我创建一个
List tasks=newlist()
我希望
tasks
列表只包含两个元素。一个是Jane1和Jane2的联合任务,另一个是John,这样我就可以做了

  await Task.WhenAll(tasks);
  Console.Write("Done");
tasks.Add(Task.Factory.continuewhall(results.ToArray()),
myTasks=>
{
var newList=新列表();
foreach(结果中的var i)
{
newList.AddRange(i.Result);
}
返回DoSomething(newList.AsEnumerable());
}));

其中,
results
是按名字排列的“我的组”项目列表

您可以从
GroupBy
开始,按名称对所有生成器进行分组

然后将这些组选择到所需的信息中,即名称和项目

要获取代表该组所有项目的任务,您可以使用
选择
获取该组中每个生成器的所有项目序列。当所有的发电机都完成时,把它交给
whalll
给我们一个任务。然后,我们可以向该任务添加一个延续,将所有项合并到一个列表中

var groups = generators.GroupBy(gen => gen.GetFirstName())
    .Select(group => new
    {
        Name = group.Key,
        Items = Task.WhenAll(group.Select(gen => gen.Generate()))
            .ContinueWith(t => t.Result.SelectMany(items => items).ToList())
    });

我不明白,为什么你需要Jane一家在一起,而最终,你只想等到一切都完成?我只想把Jane的结果结合在一起。我将结果合并到一个不同的列表中,我希望该列表只包含两个元素。Janes和John生成项目。
  await Task.WhenAll(tasks);
  Console.Write("Done");
tasks.Add(Task<IEnumerable<Items>>.Factory.ContinueWhenAll(results.ToArray(), 
myTasks => 
{
  var newList = new List<Items>();
  foreach (var i in results)
   {
     newList.AddRange(i.Result);
   }
   return DoSomething(newList.AsEnumerable());
}));
var groups = generators.GroupBy(gen => gen.GetFirstName())
    .Select(group => new
    {
        Name = group.Key,
        Items = Task.WhenAll(group.Select(gen => gen.Generate()))
            .ContinueWith(t => t.Result.SelectMany(items => items).ToList())
    });