0

genObjectListジェネリック オブジェクトの と、openListまだ使用する必要があるジェネリック オブジェクトのがあります。一部の汎用オブジェクトは相互に依存しています。そのため、すべての先行オブジェクトがすでに使用されている汎用オブジェクトのみを使用できました。私が使用する実装は次のとおりです。

var genObjectList = // get the generic objects from somewhere
var openList = new List<GenObject>(genObjectList);
var closedList = new List<GenObject>();
var rand = new Random();

while (openList.Count != 0)
{
                var candidateList =
                    openList.FindAll(
                        t => t.Predecessors.Where(p => genObjectList.Contains(p)).Intersect(closedList).Count() == t.Predecessors.Count(p => genObjectList.Contains(p)));

                var choosenGenObject = candidateList[rand.Next(0, candidateList.Count)];

                openList.Remove(choosenGenObject);
                closedList.Add(choosenGenObject);

    // Do something with the generic object
}

に300 エントリしか含まれていない場合でも、 を見つける部分はcandidateList非常に非効率的です。genObjectList

同じ動作を実現するためのより良い実装を探しています。何か案は?

編集: の誤解を招く使用を明確にするTask: 問題は、C# タスクとそのメソッドに関するものではなく、優先順位の制約とそれらの処理方法を持つ汎用オブジェクトに関するものです。これを明確にするために投稿を編集しました。

Edit2:トポロジカルソートを使用するというアドバイスは正しい方法です。しかし、私はsthを探しています。これは、「非決定論的トポロジカル ソート」と表現できます。たとえば、深さ優先検索の実装でQuickGraphは、一意でなくても、常に同じトポロジカル ソートが得られます。タイブレーカーとして乱数を使用する実装を探しているため、すべてのトポロジーソートを作成する機会があります。

4

0 に答える 0