如何创建循环列表的 GetEnumerator?
how do I create GetEnumerator of my circular list?
我必须创建自己的循环列表,我使用通用的。
首先我创建 Node<D>
class 代表数据和下一个元素
private class Node<D> {
public D info;
public Node<D> next;
public Node() {
}
public Node(D p) {
info = p;
}
}
为了创建循环列表,我创建了 circularList<T>
class。此 class 使用 Node<>
作为元素的项目。
这里是CircularList<T>
class
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
class 需要 GetEnumerator()
.
实际上我可以循环我所有的循环列表,但我正在使用 do-while
并且我需要 Node<T>
来开始循环。但我不想使用 Node
和 do-while
.
如何创建 GetEnumerator()?
感谢任何帮助。 :)
谢谢
注:我真的很不明白IEnumerable
之类的东西,请不要着急举个例子和解释一下。
您需要从 IEnumerable
实施 GetEnumerator()
方法,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
只是 "custom" 列表的后备存储。只要您正确实现了底层功能,myList
就可以是数组、数组列表等。
为简单起见,我在这里使用了 List<T>
,它已经实现了接口 IEnumerable<T>
和 IEnumerator<T>
(注意 IEnumera**tor**
而不是 IEnumerable
)。
有关 IEnumerator
和 IEnumerable
之间区别的更多详细信息,请参阅 this 答案
此外,foreach
语句隐藏了枚举器的复杂性。
有关详细信息,请参阅 IEnumerator。
编译器将 foreach
变成这样的东西:
CircularList<string> testList=new CircularList<string>();
IEnumerator testEnumerator= testList.GetEnumerator();
while (testEnumerator.MoveNext())
{
string yourForEachIteratorVariable = (string)testEnumerator.Current
...
}
Please note that the codes here are only for the illustration purposes. You could/should modify to make it more flexible and "performant" according to your need/requirement.
而对于 链表 ,你不需要支持 List<T>
,你可以简单地 add/insert 在你的 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();
}
我必须创建自己的循环列表,我使用通用的。
首先我创建 Node<D>
class 代表数据和下一个元素
private class Node<D> {
public D info;
public Node<D> next;
public Node() {
}
public Node(D p) {
info = p;
}
}
为了创建循环列表,我创建了 circularList<T>
class。此 class 使用 Node<>
作为元素的项目。
这里是CircularList<T>
class
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
class 需要 GetEnumerator()
.
实际上我可以循环我所有的循环列表,但我正在使用 do-while
并且我需要 Node<T>
来开始循环。但我不想使用 Node
和 do-while
.
如何创建 GetEnumerator()?
感谢任何帮助。 :)
谢谢
注:我真的很不明白IEnumerable
之类的东西,请不要着急举个例子和解释一下。
您需要从 IEnumerable
实施 GetEnumerator()
方法,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
只是 "custom" 列表的后备存储。只要您正确实现了底层功能,myList
就可以是数组、数组列表等。
为简单起见,我在这里使用了 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
...
}
Please note that the codes here are only for the illustration purposes. You could/should modify to make it more flexible and "performant" according to your need/requirement.
而对于 链表 ,你不需要支持 List<T>
,你可以简单地 add/insert 在你的 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();
}