我有一个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:使用拓扑排序的建议是正确的方法。但是我正在寻找某事。这可以描述为“非确定性拓扑排序”。例如,深度优先搜索实现QuickGraph
总是得到相同的拓扑排序,即使它不是唯一的。我正在寻找一种使用随机数作为决胜局的实现,因此有机会创建所有拓扑排序。