web-dev-qa-db-ja.com

クラスをC#でIEnumerableとして作成する方法は?

だから私はクラスとその中にジェネリックリストを持っていますが、それはプライベートです。

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

これを行うようにクラスを機能させたい:

foreach(Contact in contacts) .... ;

このように(動作しません):

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

上記の例では、Contactクラスのインスタンスcは、contacts(cのプライベートメンバー)からすべてのアイテムを返す必要があります。

どうすればいいのですか? IEnumerableが利回りを返す必要があることはわかっていますが、どこで宣言するのですか?

19
Ivan Prodanov

インターフェース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
}
31
LightStriker

または、GetEnumeratorメソッドを提供してIEnumerator<Contact>を返します。

class Contacts
{
    List<Contact> contacts;

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

foreachGetEnumeratorを探します。これに関する言語仕様の詳細については、こちらをご覧ください: https://stackoverflow.com/a/3679993/28424

foreachステートメントでVisual C#クラスを使用できるようにする方法

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

あなたのためのトリックを行う必要があります。

5
Tigran
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; }
}
2
flaugh

List<Contact>

他のクラスを拡張したくない場合は、非常にシンプルで高速なオプションです。

class Contacts :List<Contact>
{   
}
1
Stephanie