所以我内部有一个类和一个通用List,但它是私有的。
class Contacts
{
List<Contact> contacts;
...
}
我想让课程正常工作:
foreach(Contact in contacts) .... ;
像这样(不工作):
Contacts c;
foreach(Contact in c) .... ;
在上面的示例中,Contact类实例c必须从联系人(c的私有成员)返回每个项目的返回
我该怎么办?我知道它必须是IEnumerable与yield return,但在哪里声明?
答案 0 :(得分:29)
实现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
}
答案 1 :(得分:13)
或者通过提供IEnumerator<Contact>
方法返回GetEnumerator
:
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
答案 2 :(得分:5)
public class Contacts: IEnumerable
{
......
public IEnumerator GetEnumerator()
{
return contacts.GetEnumerator();
}
}
应该为你做一个技巧。
答案 3 :(得分: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; }
}
答案 4 :(得分:1)
如何扩展List<Contact>
如果您不想扩展任何其他类,那么这是一个非常简单,快速的选项:
class Contacts :List<Contact>
{
}