Почему вариант с yield работает как минимум в двараза медленнее?
С разу скажу Reflectorom не смотрел.. и понимаю что yield городит много чего... но всетаки
Честно говоря не ожидал...
Имеем описание класса:
public class Node
{
public List<Node> Childs { get; set; }
public string Title { get; set; }
public string WBSValue { get; set; }
public decimal Cost { get; set; }
public Node()
{
Childs = new List<Node>();
}
public override string ToString()
{
return String.Format("WBS : {0}, Cost = {1}, Childs = {2}", WBSValue, Cost, Childs.Count);
}
}
И два варианта обхода дерева созданного из этих классов.
Используя yield
IEnumerable<Node> GetNodesCostPositiveIter(Node root)
{
var stack = new Queue<Node>();
stack.Enqueue(root);
while (stack.Count > 0)
{
var rootNode = stack.Dequeue();
foreach (var child in rootNode.Childs)
{
if (child.Childs.Count > 0)
stack.Enqueue(child);
if (child.Cost > 0)
yield return child;
}
}
}
И просто список
IEnumerable<Node> GetNodesCostPositiveIterList(Node root)
{
var stack = new Queue<Node>();
stack.Enqueue(root);
List<Node> result = new List<Node>();
while (stack.Count > 0)
{
var rootNode = stack.Dequeue();
foreach (var child in rootNode.Childs)
{
if (child.Childs.Count > 0)
stack.Enqueue(child);
if (child.Cost > 0)
result.Add(child);
}
}
return result;
}