我是学习c#的菜鸟,还请各位大虾帮助
我想知道在集合中如何实现迭代,如何利用IEnumerator interface和IEnumerable interface实现集合的迭代,以了解foreach到底是怎么工作的。IEnumerator interface和IEnumerable interface的区别在哪里?能给举个实现集合迭代的例子是最好的了。希望各位高手帮忙,谢了。

解决方案 »

  1.   

    首先你应该了解一下迭代器模式IEnumerable只是为了返回IEnumerator接口
    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()) {}
      

  2.   

    2楼说的没错,yield从来没用过,汗一个.....
      

  3.   

    2楼说的很好了,楼主想多学点,可以把泛型带上,下面个例子希望对楼主有帮助
    [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]