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

所以我在其中有一个类和一个通用List,但它是私有的。

class Contacts { List contacts; ... } 

我想让这个课有效:

 foreach(Contact in contacts) .... ; 

像这样(不工作):

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

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

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

实现IEnumerable接口:

 class Contacts : IEnumerable { List contacts; #region Implementation of IEnumerable public IEnumerator GetEnumerator() { return contacts.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } #endregion } 

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

 class Contacts { List contacts; public IEnumerator 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(); 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 { public List ContactList { get; set; } public IEnumerator GetEnumerator() { return ContactList.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return ContactList.GetEnumerator(); } } class Contact { public string Name { get; set; } } 

如何扩展List

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

 class Contacts :List { }