2012-10-30 13 views
12

所以我有一個類和一個通用的列表裏面,但它是私人的。如何使類在IE中作爲IEnumerable?

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

我想使班級工作,因爲這會做:

foreach(Contact in contacts) .... ; 

像這樣(沒有工作):

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

在Contact類的實例上述c的例子有以收益從聯繫人的每個項目返回(私人會員c)

我該怎麼做?我知道它必須是IEnumerable和yield return,但是在哪裏聲明?

回答

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

@John:兩種方法之間?一個是IEnumerable的實現,另一個是IEnumarable <>。當您實現IEnumarable <>時,您還必須實現IEnumarable。 – LightStriker

+0

但我得到第二個方法'Contacts.IEnumerable.GetEnumerator()'這個錯誤:包含類型不實現接口'System.Collections.IEnumerable' –

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

應該爲你做一招。

+0

不能編譯... – Virus721

10

,還是通過提供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

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

+0

@TimeSchmelter:如果foreach知道這個類實現了一個GetEnumerator方法(如果它沒有接口來聲明實現契約),它是如何實現的? – LightStriker

+2

@ Marc-AndréJutras:'foreach'查找'GetEnumerator'。看看這裏的語言規範的詳細信息:http://stackoverflow.com/a/3679993/284240 –

+0

Interresting。一直以來都認爲該界面是強制性的。很高興知道。 「忽略IEnumerable和IEnumerator的缺點是集合類不再能夠與其他公共語言運行時兼容語言的foreach語句或等價語言互操作。」......噢......這是一個殺手。 – 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

如何只延長List<Contact>

如果你不想擴展任何其他類的一個非常簡單的,快速選項:

class Contacts :List<Contact> 
{ 
} 
相關問題