using System;
using System.Collections.Generic;

class Item : IEquatable<Item>
{
    int value;

    public Item(int i)
    {
        value = i;
    }

    public override string ToString()
    {
        return value.ToString();
    }

    public bool Equals(Item obj)
    {
        return value.Equals(obj.value);
    }
}


class Program
{
    static void Main(string[] args)
    {
        // Container gewünschter Anfangskapazität erzeugen
        LinkedList<Item> container = new LinkedList<Item>();

        // Elemente in Container ablegen
        container.AddLast(new Item(10));
        container.AddLast(new Item(20));
        container.AddLast(new Item(30));
        container.AddLast(new Item(40));
        container.AddLast(new Item(50));

        // Elemente in Container mit Hilfe eines Enumerators durchlaufen und ausgeben    
        Console.WriteLine("\n Elemente in Auflistung: ");
        foreach (Item elem in container)
            Console.WriteLine(" {0}", elem);

        Console.WriteLine();

        // Element 30 suchen (Elemente werden mit Equals() verglichen);
        // wenn vorhanden, löschen und die hinteren Elemente  nach vorne schieben
        container.Remove(new Item(30));

        Console.WriteLine(" Element mit dem Wert 30 löschen");

        // Element Item(40) suchen
        LinkedListNode<Item> node = container.Find(new Item(40));
        Item oldItem = node.Value;

        // Element Item(40) ändern
        node.Value = new Item(44);

        Console.WriteLine(" Element {0} durch {1} ersetzt",
                         oldItem, node.Value);

        // zwischen 1. und 2. Element ein neues Element einfügen
        container.AddAfter(container.First, new Item(15));

        Console.WriteLine(" Nach 1. Element ein neues Element {0} eingefügt",
                          (container.Find(new Item(15))).Value);

        Console.WriteLine("\n Elemente in Auflistung: ");
        foreach (Item elem in container)
            Console.WriteLine(" {0}", elem);
    }
}

