如何在C#中将类作为IEnumerable?

Iva*_*nov 19 c# ienumerable class

所以我内部有一个类和一个通用List,但它是私有的.

class Contacts
{
    List<Contact> contacts;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想让这个课有效:

foreach(Contact in contacts) .... ;
Run Code Online (Sandbox Code Playgroud)

像这样(不工作):

Contacts c;
foreach(Contact in c) .... ;
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,Contact类实例c必须从联系人返回每个项目(c的私有成员)

我该怎么做?我知道它必须是IEnumerable与yield return,但在哪里声明?

Lig*_*ker 31

实现IEnumerable接口:

class Contacts : IEnumerable<Contact>
{
    List<Contact> contacts;

    #region Implementation of IEnumerable
    public IEnumerator<Contact> GetEnumerator()
    {
        return contacts.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
    #endregion
}
Run Code Online (Sandbox Code Playgroud)

  • @John:在两种方法之间?一种是 IEnumerable 的实现,一种是 IEnumarable&lt;&gt;。当您实现 IEnumarable&lt;&gt; 时,您还必须实现 IEnumarable。 (2认同)

Tim*_*ter 13

或者IEnumerator<Contact>通过提供GetEnumerator方法返回:

class Contacts
{
    List<Contact> contacts;

    public IEnumerator<Contact> GetEnumerator()
    {
        foreach (var contact in contacts)
            yield return contact;
    }
}
Run Code Online (Sandbox Code Playgroud)

foreach验看GetEnumerator.请看这里有关此语言规范的详细信息:https://stackoverflow.com/a/3679993/284240

如何使一个Visual C#类在foreach语句中可用

  • @ Marc-AndréJutras:`foreach`寻找`GetEnumerator`.请查看语言规范详细信息:http://stackoverflow.com/a/3679993/284240 (2认同)

Tig*_*ran 5

public class Contacts: IEnumerable
{
     ...... 
    public IEnumerator GetEnumerator()
    {
        return contacts.GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

应该为你做一个技巧.