だから私はクラスとその中にジェネリックリストを持っていますが、それはプライベートです。
class Contacts
{
List<Contact> contacts;
...
}
これを行うようにクラスを機能させたい:
foreach(Contact in contacts) .... ;
このように(動作しません):
Contacts c;
foreach(Contact in c) .... ;
上記の例では、Contactクラスのインスタンスcは、contacts(cのプライベートメンバー)からすべてのアイテムを返す必要があります。
どうすればいいのですか? IEnumerableが利回りを返す必要があることはわかっていますが、どこで宣言するのですか?
インターフェース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/28424
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>
{
}