foreach 是否使用 IEnumerator/IEnumerable 作为内置类型?

发布于 2024-12-07 07:31:03 字数 110 浏览 0 评论 0原文

foreach 循环使用接口 IEnumeratorIEnumerable 是否仅用于迭代自定义类型(类)的对象,或者也用于迭代内置类型(在幕后)?

Does the foreach loop use interfaces IEnumerator and IEnumerable only for iterating the objects of custom types (classes) or also for iterating the built-in types (behind the scenes)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

夏花。依旧 2024-12-14 07:31:03

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

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

来自 MSDN:

  • 集合类型:

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

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

来自 MSDN - 将 foreach 与集合结合使用

更新:请参阅更新的 MSDN 页面 - 如何:使用 foreach 访问集合类(C# 编程指南)

Foreach doesn't depend on IEnumerable as such. However, if a type implements it then a foreach loop will be able to enumerate it (pattern-based matching).

Behind the scenes it only needs a GetEnumerator() method and the enumerator must contain Current and MoveNext().

From MSDN:

  • The collection type:

    • Must be one of the types: interface, class, or struct.
    • Must include an instance method named GetEnumerator that returns a type, for example, Enumerator (explained below).
  • The type Enumerator (a class or struct) must contain:

    • A property named Current that returns ItemType or a type that can be converted to it. The property accessor returns the current element of the collection.
    • A bool method, named MoveNext, that increments the item counter and returns true if there are more items in the collection.

From MSDN - Using foreach with Collections

UPDATED: See updated MSDN page for this - How to: Access a Collection Class with foreach (C# Programming Guide) .

热风软妹 2024-12-14 07:31:03

定义枚举器,没有 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) 
{  
}

Define enumerator, no IEnumerable declaration.!

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);
    }
}

Somewhere in code can use :

WorkInfo wi = new WorkInfo();
foreach(WorkItem witem in wi) 
{  
}
逆光下的微笑 2024-12-14 07:31:03

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

foreach uses IEnumerable for both native and custom types. If you look at System.Array for example, which is the base for all array types, it implements IEnumerable.

也只是曾经 2024-12-14 07:31:03

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

foreach 不依赖于 IEnumerable,它使用基于模式的匹配。请参阅 http://blogs.msdn。 com/b/ericlippert/archive/2011/06/30/following-the-pattern.aspx

for-each is language construct and does not really differentiate between custom/built-in types.

for each is not dependent on IEnumerable, it uses pattern based matching. See http://blogs.msdn.com/b/ericlippert/archive/2011/06/30/following-the-pattern.aspx

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文