Ich hät auch noch was:
Ist zwar mehr Code, aber der ist (1) wesentlich effizienter als der von Rod (stets Laufzeit von O(1), da bei next() nur der nächste index aufgerufen wird), nur das Laden der Werte dauert verhältnismäßig "länger" (da die iterierung weiter delegiert wird (quasi an das array), anstatt explizit einen iterator für so eine baumstruktur zu implementieren) mit "länger" sinds denk ich paar ms wenn nich ns gemeint.
(2) kann man das besser modizifizieren (z.B. wenn er beim letzten knoten ist und zum anfang zurück soll einfach die MoveNext Methode umschreiben sind 2-3 Zeilen) und (3) sieht's schicker aus (sehr wichtig!)
C#-Quellcode
C#-Quellcode
- public class CustomTreeView : TreeView, IEnumerable<TreeNode>
- {
- public IEnumerator<TreeNode> GetEnumerator()
- {
- return new TreeViewIterator(this);
- }
- IEnumerator IEnumerable.GetEnumerator()
- {
- return new TreeViewIterator(this);
- }
- private class TreeViewIterator : IEnumerator<TreeNode>
- {
- public TreeViewIterator(TreeView pTree)
- {
- pNodes = new TreeNode[pTree.GetNodeCount(true)];
- fillArray(pTree);
- _count = 0;
- }
- private TreeNode[] pNodes;
- private int _count;
- public TreeNode Current
- {
- get
- {
- return pNodes[_count];
- }
- }
- private void fillArray(TreeView pTree)
- {
- foreach (TreeNode elem in pTree.Nodes)
- {
- recursiveFilling(elem);
- }
- }
- private void recursiveFilling(TreeNode pNode)
- {
- pNodes[_count++] = pNode; // Preorder traversierung um bauminhalte abzuspeichern
- foreach (TreeNode elem in pNode.Nodes)
- {
- recursiveFilling(elem);
- }
- }
- object IEnumerator.Current
- {
- get
- {
- return pNodes[_count];
- }
- }
- public void Dispose()
- {
- throw new NotImplementedException(); // ist hier unwichtig
- }
- public bool MoveNext()
- {
- if (_count == pNodes.Length - 1)
- return false;
- _count++;
- return true;
- }
- public void Reset()
- {
- _count = 0;
- }
- }
- }
Ist zwar mehr Code, aber der ist (1) wesentlich effizienter als der von Rod (stets Laufzeit von O(1), da bei next() nur der nächste index aufgerufen wird), nur das Laden der Werte dauert verhältnismäßig "länger" (da die iterierung weiter delegiert wird (quasi an das array), anstatt explizit einen iterator für so eine baumstruktur zu implementieren) mit "länger" sinds denk ich paar ms wenn nich ns gemeint.
(2) kann man das besser modizifizieren (z.B. wenn er beim letzten knoten ist und zum anfang zurück soll einfach die MoveNext Methode umschreiben sind 2-3 Zeilen) und (3) sieht's schicker aus (sehr wichtig!)