繁体   English   中英

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

[英]How to make the class as an IEnumerable in C#?

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

class Contacts
{
    List<Contact> contacts;
    ...
}

我想让这个课有效:

foreach(Contact in contacts) .... ;

像这样(不工作):

Contacts c;
foreach(Contact in c) .... ;

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

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

实现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
}

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

class Contacts
{
    List<Contact> contacts;

    public IEnumerator<Contact> GetEnumerator()
    {
        foreach (var contact in contacts)
            yield return contact;
    }
}

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

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

public class Contacts: IEnumerable
{
     ...... 
    public IEnumerator GetEnumerator()
    {
        return contacts.GetEnumerator();
    }
}

应该为你做一个技巧。

class Program
{
    static void Main(string[] args)
    {
        var list = new Contacts();
        var a = new Contact() { Name = "a" };
        var b = new Contact() { Name = "b" };
        var c = new Contact() { Name = "c" };
        var d = new Contact() { Name = "d" };
        list.ContactList = new List<Contact>();
        list.ContactList.Add(a);
        list.ContactList.Add(b);
        list.ContactList.Add(c);
        list.ContactList.Add(d);

        foreach (var i in list)
        {
            Console.WriteLine(i.Name);
        }
    }
}

class Contacts : IEnumerable<Contact>
{
    public List<Contact> ContactList { get; set; }

    public IEnumerator<Contact> GetEnumerator()
    {
        return ContactList.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return ContactList.GetEnumerator();
    }
}

class Contact
{
    public string Name { get; set; }
}

如何扩展List<Contact>

如果您不想扩展任何其他类,那么它是一个非常简单,快速的选项:

class Contacts :List<Contact>
{   
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM