staynight0083
staynight0083

Reputation: 13

C# Class implementation with generics

Hi everyone I am studying C# but ran into some compiler errors: I am getting the error: 'LinkedList' does not implement interface member 'IEnumerable.GetEnumerator()'

I think I did.

Below is the code:

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
}

I am using the Visual Studio Code to compile the code. Error ecountered:

'LinkedList' does not implement interface member 'IEnumerable.GetEnumerator()'

Using the generic type 'IEnumerator' requires 1 type arguments

Using the generic type 'IEnumerable' requreis 1 type arguments

'IEnumerable' in explicit interface declaration is not an interface

Question:

1) Should I inherit the IEnumerable class or IEnumerable class with generic?

2) How can I implement the "IEnumerable.GetEnumerator()" It looks like the compiler is not recognized my GetEnumerator() implementation but I am not sure why....

Need some help here. Thank you!

Updating the complete code below. It works!!

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);
            }

        }
    }
}

Upvotes: 1

Views: 462

Answers (1)

Anu Viswan
Anu Viswan

Reputation: 18155

Regarding your two questions, here are 2 cents. 1. I would suggest you implement the generic version. This would ensure type-safety and other benefits. You can read more on advantages of generics in this link. . Since you are learning C#, it would be a good idea to read about it.

  1. Your implementation looks good.Please add reference to System.Collections namespace to your code for fixing the compile errors.

    using System.Collections;

Upvotes: 1

Related Questions