1

假设我有所有的类实现IGenerator

List<IGenerator> generators = new List<IGenerator> { new Jane1Generator(), new Jane2Generator(), new JohnGenerator() };

public interface IGenerator
{
    string GetFirstName();
    Task<List<Items>> Generate();
}

因此,分组generators依据GetFirstName()Jane1Jane2放在同一类别中。如何将任务合并为一个任务,并保持Jane1分开。我想将两个 Janes 的结果合并到一个列表中。Jane2John

        foreach (var groupedByName in generators.GroupBy(i => i.GetFirstName()))
        {
            //Combine Tasks of Jane1 & Jane2
            //give me a new Task that's is the sum of Jane1 & Jane2 tasks.
            //almost like List<Items>.Join(AnotherList) wrapped with a Task, so I can wait for both Tasks and Get combined Results instead.
        }

所以如果我创建一个List<Task<List<Items>>> tasks = new List<Task<List<Items>>>(); 我希望tasks列表只包含两个元素。一个是 Jane1&Jane2 的组合任务,另一个是 John,所以我可以

  await Task.WhenAll(tasks);
  Console.Write("Done");
4

2 回答 2

2

您可以首先GroupBy按名称对所有生成器进行分组。

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

要获取代表该组所有项目的任务,您可以使用该任务获取组Select中每个生成器的所有项目的序列。将其WhenAll赋予给我们一项任务,该任务将在所有生成器完成时完成。然后,我们可以为该任务添加一个延续,将所有项目组合到一个列表中。

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())
    });
于 2013-08-09T18:03:51.293 回答
0
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());
}));

results我的组项目列表在哪里,按他们的名字排列。

于 2013-08-09T17:38:04.660 回答