1

すべてのクラスが実装されていると仮定しますIGenerator

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

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

したがって、グループ化generatorsすると、 andが同じカテゴリにGetFirstName()配置されます。とのタスクを単一のタスクに結合し、別々に保つにはどうすればよいですか。両方のジェーンの結果を 1 つのリストに結合したいと考えています。Jane1Jane2Jane1Jane2John

        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.
        }

そのため、リストを作成する場合、2 つの要素のみを含めるList<Task<List<Items>>> tasks = new List<Task<List<Items>>>(); 必要があります。tasks1 つは Jane1 と Jane2 の結合タスクで、もう 1 つは John だけです。

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

2 に答える 2

2

GroupBy最初に、すべてのジェネレーターを名前でグループ化できます。

次に、それらのグループを必要な情報、つまり名前とアイテムに選択します。

そのグループのすべてのアイテムを表すタスクを取得するSelectには、グループ内の各ジェネレーターのすべてのアイテムのシーケンスを取得するために使用できます。これを与えるとWhenAll、すべてのジェネレーターが終了したときに実行されるタスクが得られます。次に、そのタスクに継続を追加して、すべての項目を 1 つのリストにまとめることができます。

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());
}));

resultsfirstName ごとのグループ アイテムのリストはどこにありますか。

于 2013-08-09T17:38:04.660 に答える