Реализация класса C # с обобщениями - PullRequest
0 голосов
/ 24 ноября 2018

Привет всем, я изучаю C #, но столкнулся с некоторыми ошибками компилятора: я получаю ошибку: 'LinkedList' не реализует элемент интерфейса 'IEnumerable.GetEnumerator ()'

Я думаю, что сделал.

Ниже приведен код:

using System;
using System.Collections.Generic;

namespace LinkedListGenericsExample
{
     public class LinkedListNode<T>
     {
         //constructor
         public LinkedListNode(T value)
         {
             //code here
         }
         //code here
     }

     //LinkedList class with generics. It inherit the IEnumerable class with 
     //generics. Should I use IEnumerable or IEnumerable<T>?
     public class LinkedList<T>: IEnumerable<T>
     {
         //code here
     }

     public LinkedListNode<T> AddLast(T node)
     {
         //code here
     }

     public IEnumerator<T> GetEnumerator()
     {
         //code here
     }

     //here I think the GetEnumerator() method is implemented
     IEnumerator IEnumerable.GetEnumerator()
     {
         return GetEnumerator();
     }

     //Trying this but not working. Also I am confused.
     /*
     IEnumerator IEnumerable<T>.GetEnumerator()
     {
         return GetEnumerator();
     }
     */

     //Main() below
}

Я использую код Visual Studio для компиляции кода.Обнаружена ошибка:

'LinkedList' не реализует элемент интерфейса 'IEnumerable.GetEnumerator ()'

Использование универсального типа 'IEnumerator' требует аргументов 1 типа

Использование универсального типатип 'IEnumerable' requreis 1 аргументы типа

'IEnumerable' в явном объявлении интерфейса не является интерфейсом

Вопрос:

1) Должен ли я наследовать класс IEnumerable или класс IEnumerableс generic?

2) Как я могу реализовать "IEnumerable.GetEnumerator ()" Похоже, компилятор не распознал мою реализацию GetEnumerator (), но я не уверен, почему ....

Нужна помощь здесь.Спасибо!

Обновление полного кода ниже.Это работает !!

using System;
using System.Collections; //using System.Collections instead

namespace LinkedListGenericsExample
{
    //Linked list node class in Generics form
    public class LinkedListNode<T> 
    {
        //LinkedListNode constructor
        public LinkedListNode(T value)
        {
            this.Value = value;
        }

        public T Value; 
        public LinkedListNode<T> Next {get; internal set;} 
        public LinkedListNode<T> Prev {get; internal set;}

    }

    public class LinkedList<T>: IEnumerable  
    {
        public LinkedListNode<T> First {get; private set;}
        public LinkedListNode<T> Last {get; private set;}

        public LinkedListNode<T> AddLast(T node)
        {
            var newNode = new LinkedListNode<T>(node);
            if (First == null)
            {
                First = newNode;
                Last = First;
            }
            else
            {
                Last.Next = newNode;
                Last = newNode;
            }

            return newNode; 
        } 

        public IEnumerator GetEnumerator()  
        {
            LinkedListNode<T> current = First;

            while(current != null)
            {
                yield return current.Value;
                current = current.Next;
            }      
        }

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

        /*
        IEnumerator IEnumerable<T>.GetEnumerator()
        {
        }
        */
    }
    class Program
    {

        static void Main(string[] args)
        {
            //Console.WriteLine("Hello World!");
            var list2 = new LinkedList<int>();
            var list3 = new LinkedList<String>();
            list2.AddLast(1);
            list2.AddLast(3);
            list2.AddLast(5);

            //Go throuhg entire list of numbers
            foreach(int i in list2)
            {
                Console.WriteLine(i);
            }

            Console.WriteLine();

            list3.AddLast("2");
            list3.AddLast("four");
            list3.AddLast("foo"); 

            //Go through entire list of strings
            foreach(string s in list3)
            {
                Console.WriteLine(s);
            }

        }
    }
}

1 Ответ

0 голосов
/ 24 ноября 2018

Что касается ваших двух вопросов, вот 2 цента.1. Я бы предложил вам реализовать универсальную версию.Это обеспечит безопасность типов и другие преимущества.Подробнее о преимуществах дженериков вы можете прочитать по этой ссылке . .Поскольку вы изучаете C #, неплохо было бы прочитать об этом.

Ваша реализация выглядит хорошо. Пожалуйста, добавьте ссылку на пространство имен System.Collections в ваш код для исправления ошибок компиляции.

с использованием System.Collections;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...