我必须创建自己的循环列表,我使用通用列表。
首先我创建代表数据的Node<D>
类和元素的下一个
private class Node<D> {
public D info;
public Node<D> next;
public Node() {
}
public Node(D p) {
info = p;
}
}
要创建循环列表,我创建了circularList<T>
类。此类使用Node<>
作为元素的项目。
这是CircularList<T>
类
class CircularList<T> : IEnumerable<T> {
public Node<T> start;
public Node<T> rear;
public int count = 0;
public CircularList(T firstItem) {
start = new Node<T>(firstItem);
rear = start;
rear.next = start;
}
public void Insert(T newItem) {
//Inserting code here
}
public void Update(T oldItem, T newItem) {
//Updating code is here
}
public void Delete(T theItem) {
//deleting code is here
}
}
当我开始使用foreach
foreach(string item in CircularList<string>){
}
我收到错误消息称circularlist
课程需要GetEnumerator()
。
实际上我可以遍历我的所有循环列表,但我使用do-while
并且我需要Node<T>
来启动循环。但我不想使用Node
和do-while
。
如何创建GetEnumerator()?
任何帮助表示赞赏。 :)
谢谢
注意:我真的非常不了解IEnumerable
这些事情,请通过示例和解释轻松一下。
答案 0 :(得分:0)
您需要在GetEnumerator()
中实施IEnumerable
方法才能使foreach
正常工作。
使用以下内容:
public class CircularList<T> : IEnumerable<T>
{
private List<T> mylist = new List<T>();
public T this[int index]
{
get
{
return this.mylist[index];
}
set
{
this.mylist.Insert(index, value);
}
}
public IEnumerator<T> GetEnumerator()
{
return this.mylist.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
mylist
维护T
,insert
和update
类型delete
的列表。
修改强>
myList
只是“自定义”列表的后备存储。只要您正确实现基础功能,myList
可以是数组,arraylist等。
为简单起见,我在这里使用了List<T>
,它已经实现了接口IEnumerable<T>
和IEnumerator<T>
(注意IEnumera**tor**
而不是IEnumerable
)。
有关IEnumerator
和IEnumerable
此外,foreach
语句隐藏了枚举器的复杂性。
有关详细信息,请参阅IEnumerator。
编译器将foreach
变成这样的东西:
CircularList<string> testList=new CircularList<string>();
IEnumerator testEnumerator= testList.GetEnumerator();
while (testEnumerator.MoveNext())
{
string yourForEachIteratorVariable = (string)testEnumerator.Current
...
}
请注意,此处的代码仅用于说明目的。您可以/应该根据您的需要/要求进行修改以使其更加灵活和“高效”。
对于链接列表,您不需要支持List<T>
,只需在head
节点上添加/插入并实现GetEnumerator(),如下所示:
public IEnumerator<T> GetEnumerator()
{
var node = start;
while(node != null)
{
yield return node.info;
node = node.next;
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}