2012-10-30 21 views
12

私はそれの中にクラスとジェネリックリストを持っていますが、プライベートです。 (動作しない)このようなC#でIEnumerableとしてクラスを作成するには?

foreach(Contact in contacts) .... ; 

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

は、私はこれが行うようにクラスの仕事したい連絡先クラスのインスタンスC上記の例では

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

を持っています連絡先からすべてのアイテムを返す(個人のc)

どうすればいいですか?私はそれが収穫の戻り値でIEnumerableでなければならないことを知っていますが、それを宣言するのはどこですか?

答えて

19

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 
} 
+0

これらの違いは何ですか? –

+0

@ジョン:2つの方法の間に? 1つはIEnumerableの実装であり、1つはIEnumarable <>です。 IEnumarable <>を実装するときは、IEnumarableも実装する必要があります。 – LightStriker

+0

しかし、私は2番目のメソッド 'Contacts.IEnumerable.GetEnumerator()'でこのエラーが発生します:型を含むインターフェイス 'System.Collections.IEnumerable'を実装していません –

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

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

+0

どちらもコンパイルされません... – Virus721

10

またはGetEnumerator方法を提供することによって、IEnumerator<Contact>を返す:foreachGetEnumerator探し

class Contacts 
{ 
    List<Contact> contacts; 

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

。このについての言語仕様の詳細についてはこちらをご覧:あなたはその非常に単純な他のクラスを拡張したくない場合は、単にList<Contact>

の拡張についてhttps://stackoverflow.com/a/3679993/284240

How to make a Visual C# class usable in a foreach statement

+0

@TimeSchmelter:実装契約を宣言するインターフェイスがない場合、このクラスがGetEnumeratorメソッドを実装することをforeachがどのように知っていますか? – LightStriker

+2

@ Marc-AndréJutras: 'foreach'は' GetEnumerator'を探します。ここで言語仕様の詳細を見てみましょう:http://stackoverflow.com/a/3679993/284240 –

+0

Interresting。常にインターフェイスが必須であるという印象を受けました。知っておいてよかった。 "IEnumerableとIEnumeratorを省略することの欠点は、コレクションクラスが他の共通言語ランタイム互換言語のforeachステートメントまたは同等のものとの相互運用性がなくなっていることです。" ... Oww ...それはキラーです。 – LightStriker

2
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; } 
} 
0

方法を、高速オプション:

class Contacts :List<Contact> 
{ 
} 
関連する問題