foreach是否将IEnumerator / IEnumerable用于内置类型?

时间:2011-09-29 09:10:18

标签: c# .net interface foreach enumerators

foreach循环是否仅使用接口IEnumeratorIEnumerable来迭代自定义类型(类)的对象,还是迭代内置类型(在后台)?

4 个答案:

答案 0 :(得分:7)

Foreach不依赖于IEnumerable。但是,如果一个类型实现它,那么foreach循环将能够枚举它(基于模式的匹配)。

在幕后,它只需要GetEnumerator()方法,而且枚举器必须包含CurrentMoveNext()

来自MSDN:

  
      
  • 集合类型:

         
        
    • 必须是以下类型之一:界面结构
    •   
    • 必须包含一个名为 GetEnumerator 的实例方法,该方法返回一个类型,例如Enumerator(如下所述)。
    •   
  •   
  • 类型Enumerator(类或结构)必须包含:

         
        
    • 名为当前的属性,它返回ItemType或可转换为它的类型。属性访问器返回集合的当前元素。
    •   
    • bool 方法,名为 MoveNext ,会增加项目计数器,如果集合中有更多项目,则返回 true
    •   
  •   

来自MSDN - Using foreach with Collections

更新:请参阅更新的MSDN页面 - How to: Access a Collection Class with foreach (C# Programming Guide)

答案 1 :(得分:2)

定义枚举器,没有IEnumerable声明。

public class WorkInfoEnumerator
{
  List<WorkItem > wilist= null;
  int currentIndex = -1;


  public MyClassEnumerator(List<WorkItem > list)
  {
     wilist= list;
  }

  public WorkItem Current
  {
     get
     {
         return wilist[currentIndex];
     }
  }

  public bool MoveNext()
  {
     ++currentIndex;
     if (currentIndex < wilist.Count)
         return true;
     return false;
  }   
}


public class WorkInfo
{
    List<WorkItem > mydata = new List<WorkItem >();
    public WorkInfoEnumerator GetEnumerator()
    {
        return new WorkInfoEnumerator(mydata);
    }
}

代码中的某处可以使用:

WorkInfo wi = new WorkInfo();
foreach(WorkItem witem in wi) 
{  
}

答案 2 :(得分:0)

foreach对本机和自定义类型使用IEnumerable。例如,如果您查看System.Array(它是所有数组类型的基础),它将实现IEnumerable。

答案 3 :(得分:0)

for-each是语言构造,并没有真正区分自定义/内置类型。

对于每个都不依赖于IEnumerable,它使用基于模式的匹配。见http://blogs.msdn.com/b/ericlippert/archive/2011/06/30/following-the-pattern.aspx