实现C#的IEnumerable 对于一个LinkedList类(Implementing C

2019-06-27 06:32发布

我想用C#在Linux上使用MonoDevelop的自定义LinkedList类,只是用于测试和学习的缘故。 下面的代码编译从来没有,我不知道为什么! 它甚至没有告诉我什么是错的。 所有的东西它说的是:错误:编译器似乎已经坠毁。 详情请查看构建输出垫。 当我去检查输出接点,这是没有帮助的之一:未处理的异常信息:System.ArgumentException:指定的字段必须在泛型类型定义上声明。 参数名:场

我能做什么?

using System;
using System.Text;
using System.Collections.Generic;

namespace LinkedList
{
    public class myLinkedList<T> : IEnumerable<T>
    {
        //List Node class
        //===============
        private class ListNode<T>
        {
            public T data;
            public ListNode<T> next;

            public ListNode(T d)
            {
                this.data = d;
                this.next = null;
            }

            public ListNode(T d, ListNode<T> n)
            {
                this.data = d;
                this.next = n;
            }
        }

        //priavte fields
        //===============
        private ListNode<T> front;
        private int size;

        //Constructor
        //===========
        public myLinkedList ()
        {
            front = null;
            size = 0;
        }


        //public methods
        //===============
        public bool isEmpty()
        {
            return (size == 0);
        }

        public bool addFront(T element)
        {
            front = new ListNode<T>(element, front);
            size++;
            return true;
        }

        public bool addBack(T element)
        {
            ListNode<T> current = front;
            while (current.next != null)
            {
                current = current.next;
            }

            current.next = new ListNode<T>(element);
            size++;
            return true;
        }

        public override string ToString()
        {
            ListNode<T> current = front;
            if(current == null)
            {
                return "**** Empty ****";
            }
            else
            {
                StringBuilder sb = new StringBuilder();
                while (current.next != null)
                {
                    sb.Append(current.data + ", ");
                    current = current.next;
                }
                sb.Append(current.data);

                return sb.ToString();
            }
        }

        // These make myLinkedList<T> implement IEnumerable<T> allowing
        // a LinkedList to be used in a foreach statement.
        public IEnumerator<T> GetEnumerator()
        {
            return new myLinkedListIterator<T>(front);
        }


        private class myLinkedListIterator<T> : IEnumerator<T>
        {
            private ListNode<T> current;
            public virtual T Current
            {
                get
                {
                    return current.data;
                }
            }
            private ListNode<T> front;

            public myLinkedListIterator(ListNode<T> f)
            {
                front = f;
                current = front;
            }

            public bool MoveNext()
            {
                if(current.next != null)
                {
                    current = current.next;
                    return true;
                }
                else
                {
                    return false;
                }
            }

            public void Reset()
            {
                current = front;
            }

            public void Dispose()
            {
                throw new Exception("Unsupported Operation");
            }
        }
    }
}

Answer 1:

您需要添加的非通用的API; 所以添加到迭代器:

object System.Collections.IEnumerator.Current { get { return Current;  } }

并且可枚举:

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}

然而! 如果你是用手工实现这一点,你缺少一个窍门。 一个“迭代块”会容易得多。

下面是一个完整的实施; 你并不需要在所有写一个枚举类(你可以删除myLinkedListIterator<T>完全):

public IEnumerator<T> GetEnumerator()
{
    var node = front;
    while(node != null)
    {
        yield return node.data;
        node = node.next;
    }
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}


Answer 2:

当我试图您已经粘贴代码中,我试图建立的时候获得2个错误。

myLinkedList”不实现接口成员‘System.Collections.IEnumerable.GetEnumerator()’。 “.myLinkedList.GetEnumerator()”无法实现‘System.Collections.IEnumerable.GetEnumerator()’,因为它不具备‘System.Collections.IEnumerator’匹配的返回类型。

解决方案是实现第一类以下。

IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

而第二个错误是:

myLinkedList.myLinkedListIterator”不实现接口成员‘System.Collections.IEnumerator.Current’。 “JonasApplication.myLinkedList.myLinkedListIterator.Current”无法实现“System.Collections.IEnumerator.Current”,因为它没有“对象”的匹配返回类型。

解决第二个可能是一些如下在第二类中实现。

反对IEnumerator.Current {{返回电流; }}



文章来源: Implementing C# IEnumerable for a LinkedList class