У меня есть следующий узел:Сделать IEnumerable метод асинхронной
class Node
{
public string Name;
public IEnumerable<Node> Children;
}
У меня есть следующий метод расширения:
public static class ExtensionMethods
{
public static IEnumerable<Node> TraverseTree(this Node root)
{
if (root.Children != null)
{
foreach (var child in root.Children)
{
var nodes = TraverseTree(child);
foreach (var node in nodes)
{
yield return node;
}
}
}
yield return root;
}
}
Я хочу найти узел в дереве с именем «Foo» , Для того, чтобы сделать это я:
Node myNode = /* some large tree! */
var search = myNode.TraverseTree().Where(x=>x.Name == "Foo").FirstOrDefault();
У меня есть 3 цели
- Есть метод
TraverseTree
траверс дерева с выходом (IEnumerable), так что если 3th узел происходит иметь имя = = "Foo", тогда мне не нужно пересекать все дерево. Прямо сейчас этот случай является истинным. - Сделайте способ
TraverseTree
бежать по отдельной теме, потому что это может занять много времени. Поэтому, наверное, методTraverseTree
должен принимать параметр callBack? - Наконец, будет приятно отменить эту операцию. Нужно ли мне также передать этому методу маркер отмены?
Каков правильный способ сделать это?
К сожалению, я забыл упомянуть, я использую .Net Framework 4,0
Этот ответ Помогите? http://stackoverflow.com/a/20281941/1210520 –
Возможный дубликат [Как вернуть возвращаемый элемент при выполнении Task.WhenAny] (http://stackoverflow.com/questions/18284169/how-to-yield-return- item-when-doing-task-whenany) –