2 // System.Xml.XmlNodeList
5 // Kral Ferch <kral_ferch@hotmail.com>
11 using System.Collections;
15 public class XmlNodeListChildren : XmlNodeList
18 ///////////////////////////////////////////////////////////////////////
22 ///////////////////////////////////////////////////////////////////////
23 private class Enumerator : IEnumerator
25 XmlLinkedNode currentChild;
26 XmlLinkedNode lastChild;
28 internal Enumerator (XmlLinkedNode lastChild)
31 this.lastChild = lastChild;
34 public virtual object Current {
40 public virtual bool MoveNext()
42 bool passedEndOfCollection = Object.ReferenceEquals(currentChild, lastChild);
44 if (currentChild == null) {
45 currentChild = lastChild;
48 currentChild = currentChild.NextLinkedSibling;
50 return passedEndOfCollection;
53 public virtual void Reset()
62 ///////////////////////////////////////////////////////////////////////
66 ///////////////////////////////////////////////////////////////////////
68 XmlLinkedNode lastChild;
73 ///////////////////////////////////////////////////////////////////////
77 ///////////////////////////////////////////////////////////////////////
79 public XmlNodeListChildren(XmlLinkedNode lastChild)
81 this.lastChild = lastChild;
87 ///////////////////////////////////////////////////////////////////////
91 ///////////////////////////////////////////////////////////////////////
93 public override int Count {
97 if (lastChild != null) {
98 XmlLinkedNode currentChild = lastChild.NextLinkedSibling;
101 while (!Object.ReferenceEquals(currentChild, lastChild)) {
102 currentChild = currentChild.NextLinkedSibling;
114 ///////////////////////////////////////////////////////////////////////
118 ///////////////////////////////////////////////////////////////////////
120 public override IEnumerator GetEnumerator ()
122 return new Enumerator(lastChild);
125 public override XmlNode Item (int index)
127 XmlNode requestedNode = null;
129 // Instead of checking for && index < Count which has to walk
130 // the whole list to get a count, we'll just keep a count since
131 // we have to walk the list anyways to get to index.
132 if ((index >= 0) && (lastChild != null)) {
133 XmlLinkedNode currentChild = lastChild.NextLinkedSibling;
136 while ((count < index) && !Object.ReferenceEquals(currentChild, lastChild))
138 currentChild = currentChild.NextLinkedSibling;
142 if (count == index) {
143 requestedNode = currentChild;
147 return requestedNode;