public void Enqueue(T item)
        {
            if (Count == 0)
            {
                list.AddFirst(item);
                Count++;
                return;
            }
            GenericLinkedNode <T> currentNode = list.First;
            int index = 0;

            while (index <= Count)
            {
                if (item.CompareTo(currentNode.Value) < 0)
                {
                    list.AddBefore(currentNode, item);
                    Count++;
                    return;
                }
                index++;
                currentNode = currentNode.NextNode;
            }
            list.AddLast(item);
            Count++;
        }
        void AddTheFirstNode(T value)
        {
            GenericLinkedNode <T> node = new GenericLinkedNode <T>(value);

            First             = node;
            Last              = node;
            node.NextNode     = node;
            node.PreviousNode = node;
            Count++;
        }
        public IEnumerator <T> GetEnumerator()
        {
            GenericLinkedNode <T> currentNode = First;

            for (int i = 0; i < Count; i++)
            {
                yield return(currentNode.Value);

                currentNode = currentNode.NextNode;
            }
        }
 void PrintList(int i, GenericLinkedNode <T> node)
 {
     if (i == Count - 1)
     {
         return;
     }
     else
     {
         Console.WriteLine(node.Value);
         PrintList(i += 1, node.NextNode);
     }
 }
        public void AddBefore(GenericLinkedNode <T> node, T value)
        {
            GenericLinkedNode <T> newNode = new GenericLinkedNode <T>(value);

            newNode.NextNode     = node;
            newNode.PreviousNode = node.PreviousNode;
            node.PreviousNode    = newNode;
            if (node == First)
            {
                First = newNode;
            }
            Count++;
        }
 public void AddLast(T value)
 {
     if (First == null)
     {
         AddTheFirstNode(value);
     }
     else
     {
         GenericLinkedNode <T> node = new GenericLinkedNode <T>(value);
         node.PreviousNode = Last;
         node.NextNode     = Last.NextNode;
         Last.NextNode     = node;
         Last = node;
         Count++;
     }
 }
        public void AddAfter(GenericLinkedNode <T> node, T value)
        {
            GenericLinkedNode <T> newNode = new GenericLinkedNode <T>(value);

            newNode.PreviousNode = node;
            newNode.NextNode     = node.NextNode;
            node.NextNode        = newNode;
            node.PreviousNode    = newNode;
            if (Count == 1)
            {
                Last = newNode;
            }
            else if (node == Last)
            {
                Last = newNode;
            }
            Count++;
        }
        public GenericLinkedNode <T> Find(T value)
        {
            GenericLinkedNode <T> currentNode = First;
            int index = 0;

            while (index < Count)
            {
                if (value.Equals(currentNode.Value))
                {
                    return(currentNode);
                }
                else
                {
                    index++;
                    currentNode = currentNode.NextNode;
                }
            }
            return(null);
        }
        public bool Contains(T value)
        {
            GenericLinkedNode <T> currentNode = First;
            int index = 0;

            while (index < Count)
            {
                if (value.Equals(currentNode.Value))
                {
                    return(true);
                }
                else
                {
                    index++;
                    currentNode = currentNode.NextNode;
                }
            }
            return(false);
        }
 public void RemoveFirst()
 {
     if (Count == 0)
     {
         return;
     }
     if (Count == 1)
     {
         First = null;
         Last  = null;
         Count--;
     }
     else
     {
         GenericLinkedNode <T> temp = First.NextNode;
         temp.PreviousNode = Last;
         Last.NextNode     = temp;
         First             = temp;
         Count--;
     }
 }
 public void Clear()
 {
     Count = 0;
     First = null;
     Last  = null;
 }
 public GenericLinkedNode(T value, GenericLinkedNode <T> nextValue, GenericLinkedNode <T> previousValue)
 {
     this.Value        = value;
     this.NextNode     = nextValue;
     this.PreviousNode = previousValue;
 }