我是学习c#的菜鸟,还请各位大虾帮助
我想知道在集合中如何实现迭代,如何利用IEnumerator interface和IEnumerable interface实现集合的迭代,以了解foreach到底是怎么工作的。IEnumerator interface和IEnumerable interface的区别在哪里?能给举个实现集合迭代的例子是最好的了。希望各位高手帮忙,谢了。
我想知道在集合中如何实现迭代,如何利用IEnumerator interface和IEnumerable interface实现集合的迭代,以了解foreach到底是怎么工作的。IEnumerator interface和IEnumerable interface的区别在哪里?能给举个实现集合迭代的例子是最好的了。希望各位高手帮忙,谢了。
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
Ienumerator接口的Current是当前的项,MoveNext是向下一个项移动
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}比如 foreach(Char c in stringObj) string就实现了IEnumerable接口,它的GetEnumerator()返回了CharEnumerator,而这个类负责怎么迭代字符串里的char在.net2.0里面引入了关键字yield来简化实现IEnumerator接口
class MyIterator
{
char[] _arr = new char[10];
public IEnumerable Iterate()
{
foreach(Char c in _arr)
yield return c;
}
}
现在你可以这么用
foreach(Char c in (new MyIterator).Iterate()) {}
[code={3}]{
public class LinkedListNode<T> //节点类
{
private T value;//节点值 public LinkedListNode(T value)
{
this.value = value;
} public T Value
{
get
{
return value;
}
} //获取节点值 private LinkedListNode<T> next;//当前节点的后一节点 public LinkedListNode<T> Next
{
get
{
return next;
}
internal set //internal只有在同一程序集下才能访问
{
next = value;
}
} private LinkedListNode<T> pre;//当前节点的前一节点 public LinkedListNode<T> Pre
{
get
{
return pre;
}
internal set
{
pre = value;
}
}
}public class LinkedList<T> : IEnumerable<T> //链表类
{
private LinkedListNode<T> first;//首节点 public LinkedListNode<T> First
{
get
{
return first;
}
} private LinkedListNode<T> last;//尾节点 public LinkedListNode<T> Last
{
get
{
return last;
}
} public LinkedListNode<T> addList(T node)//节点的添加
{
LinkedListNode<T> newNode = new LinkedListNode<T>(node);
if (first == null)
{
first = newNode;
last = first;
}
else
{
last.Next = newNode;
last = newNode;
}
return newNode;
} #region IEnumerable<T> 成员 public IEnumerator<T> GetEnumerator()
{
LinkedListNode<T> current = first;
while (current != null)
{
yield return current.Value;
current = current.Next;
}
} #endregion #region IEnumerable<T> 成员 IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
return GetEnumerator();
} #endregion #region IEnumerable 成员 IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
} #endregion
}
}[/code]