using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace collection_interface
{
  public class listboxtest : IEnumerable<String>这里为什么没有加一个ienumerator接口呢,这没加下面为什么可以调用这个接口的方法呢? {  
  private string[] strings;
  private int ctr = 0;
  public IEnumerator<string> GetEnumerator()
  {
  foreach (string s in strings)
  {
  yield return s;
  }
  }
  IEnumerator IEnumerable.GetEnumerator()
  {
  return GetEnumerator();
  }
  public listboxtest(params string[] initialstrings)
  {
  strings = new String[8];
  foreach (string s in initialstrings)
  {
  strings[ctr++] = s;
  }
  }
  public void add(string thestring)
  {
  strings[ctr] = thestring;
  ctr++;
  }
  public string this[int index]
  {
  get
  {
  if (index < 0 || index >= strings.Length)
  {  
    
  }
  return strings[index];
  }
  set
  {
  strings[index] = value;  }
  }
  public int getnumentries()
  {
  return ctr;
  }
  }  class Program
  {
  static void Main(string[] args)
  {
  listboxtest lbt = new listboxtest("hello", "world");
  lbt.add("who");
  lbt.add("is");
  lbt.add("douglas");
  lbt.add("adams");
  string subst = "universe";
  lbt[1] = subst;
  foreach (string s in lbt)
  {
  Console.WriteLine("value:{0}", s);
  }
  }
  }
}

解决方案 »

  1.   

    IEnumerable<T> : IEnumerable
    IEnumerable 有 GetEnumerator方法。
      

  2.   

    可ienumerator也有这个getenumerator方法啊,方法的实现在这个接口啊。
      

  3.   

    在实现IEnumerable接口的时候需要一个IEnumerator的对象,
    通常来说我们都是继承两个接口来实现foreach
    MyClass:IEnumerable,IEnumerator
    {
        public IEnumerator GetEnumerator()
        {
             return this;//因为本身就继承了IEnumerator 
        }
    }
    这里的foreach 使用yield return后也会产生一个IEnumerator的对象。
    相当于这里new了一个IEnumerator接口的子类。
    public IEnumerator<string> GetEnumerator()
    {
        foreach (string s in strings)
        {
            yield return s;
        }
    }只要能够在GetEnumerator方法中返回一个IEnumerator的对象,继不继承都一样。
      

  4.   

    这没加下面为什么可以调用这个接口的方法呢?还有这里注意:
    GetEnumerator是在IEnumerable接口中定义的。public IEnumerator<string> GetEnumerator()
    这里只是在实现IEnumerable接口,并非调用方法。只是这个方法需要返回一个IEnumerator类型的对象
      

  5.   

    SL已经解决了,IEnumerator是对象,IEnumerable是枚举的接口,方法返回的是具体的对象。
      

  6.   

    GetEnumerator()方法返回的对象和程序最后的foreach循环有什么关系
      

  7.   

    GetEnumerator()方法返回的对象和程序最后的foreach循环有什么关系
      

  8.   

    GetEnumerator返回的对象才是真正在foreach迭代的对象。
    IEnumerator才是迭代器集合。IEnumerable只是使这个迭代器适合foreach格式IEnumerator本来是个集合,可以循环迭代。只是不能使用foreach这中格式,只能使用for循环,而且不好看。
    IEnumerable把他转换包装了一下,使他能够使用foreach循环,美好代码,便于理解。IEnumerator循环实例:                string[] strs = new string[] { "A", "B", "C" };
                    IEnumerator ier = strs.GetEnumerator();
                    for (ier.Reset(); ier.MoveNext(); )
                    {
                        //ier.Current; //依次得到A\B\C
                    }
      

  9.   

    IEnumerable唯一的作用就是规定他的实现类必须有下面这个方法。     public IEnumerator GetEnumerator()只要类中有这个方法,就可以使用foreach。