通常,我們在擷取樹形結構資料所有子節點時,需要寫一個遞迴調用的方法,迴圈調用,這是資料結構演算法裡的通用寫法。
下面介紹用 yield return是怎麼做的。如:
public class TreeNodeInfo
{
public string Name { get; set; }
public List<TreeNodeInfo> Children { get; set; }
}
擷取所有子節點:
private IEnumerable<TreeNodeInfo> GetAllChildren(TreeNodeInfo root)
{
Queue<TreeNodeInfo> queue = new Queue<TreeNodeInfo>(root.Children);
while (queue.Count > 0)
{
TreeNodeInfo node = queue.Dequeue();
yield return node;
if (node.Children != null && node.Children.Count > 0)
{
node.Children.ForEach(o =>
{
queue.Enqueue(o);
});
}
}
}
這僅僅是寫法的不同,如果用遞迴方法,運行時會幫我們處理回調方法的堆棧。而用 yield return 我們需要自己維護迴圈隊列。
用 yield return 的另一個好處是,當你調用 GetAllChildren 方法時,程式並沒有真正的運行方法體,只有你在對傳回值進行操作時,才運行方法體,這個特性在某些情境很有用。如對結果進行 foreach 操作:
IEnumerable<TreeNodeInfo> nodes = this.GetAllChildren(this.rootNode);
foreach (var item in nodes)
{
Debug.WriteLine(item.Name);
}
--完--