Generische Listenklasse mit Indexer und Enumerator

using System;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// generic list class with indexer and enumerator
/// freeware 2011 by admin of codezentrale.6x.to
/// </summary>
/// <typeparam name="T">datatype you want to manage</typeparam>
public class GenericList<T> : IEnumerable, IDisposable
{
    /// <summary>
    /// internal class, with interface for IEnumerable and IEnumerator
    /// </summary>
    private class GenericListEnumerator : IEnumerator
    {
        private int pos = -1;
        private GenericList<T> _t;

        public GenericListEnumerator(GenericList<T> t)
        {
            this._t = t;
        }

        public bool MoveNext()
        {
            if (pos < _t.Count - 1)
            {
                pos++;
                return true;
            }
            else
            {
                return false;
            }
        }

        public void Reset()
        {
            pos = -1;
        }

        public object Current
        {
            get
            {
                try
                {
                    return _t[pos];
                }
                catch (IndexOutOfRangeException)
                {
                    throw new InvalidOperationException();
                }
            }
        }
    }

    private List<T> _ObjectList = new List<T>();
    private bool _bDisposed = false;

    /// <summary>
    /// object counter
    /// </summary>
    public int Count
    {
        get { return _ObjectList.Count; }
    }
    /// <summary>
    /// indexer for direct index based access (e.g. mylist[1])
    /// </summary>
    /// <param name="pos"></param>
    /// <returns></returns>
    public T this[int pos]
    {
        get { return _ObjectList[pos]; }
        set { _ObjectList[pos] = value; }
    }

    public GenericList()
    {
    }

    // destructor, makro for 'protected override void Finalize()'
    ~GenericList()
    {
        this.Dispose(false);
    }

    // public Dispose-method for cleanup
    public void Dispose()
    {
        this.Dispose(true);
    }

    // internal Dispose-method
    private void Dispose(bool bDisposing)
    {
        if (!_bDisposed)
        {
            if (bDisposing)
            {
                // e.g. free managed resources here
            }
        }

        _bDisposed = true;
    }

    /// <summary>
    /// interface function for IEnumerable and IEnumerator
    /// </summary>
    /// <returns></returns>
    public IEnumerator GetEnumerator()
    {
        return new GenericListEnumerator(this);
    }
    /// <summary>
    /// add object to list
    /// </summary>
    /// <param name="obj">your object</param>
    public void Add(T obj)
    {
        _ObjectList.Add(obj);
    }
    /// <summary>
    /// clear list
    /// </summary>
    public void Clear()
    {
        _ObjectList.Clear();
    }
    /// <summary>
    /// swap objects inside list
    /// </summary>
    /// <param name="index1">index number one</param>
    /// <param name="index2">index number one</param>
    public void Swap(int index1, int index2)
    {
        if ((index1 >= 0) && (index2 >= 0) && (index1 < _ObjectList.Count) && (index2 < _ObjectList.Count))
        {
            T temp = _ObjectList[index1];
            _ObjectList[index1] = _ObjectList[index2];
            _ObjectList[index2] = temp;
        }
    }
    /// <summary>
    /// remove object from list
    /// </summary>
    /// <param name="obj"></param>
    public void Remove(T obj)
    {
        _ObjectList.Remove(obj);
    }
}

List-Objekt

  • dynamisches Listenobjekt zum verwalten beliebiger Objekte
using System.Collections.Generic;

// Objekt, dass in die Liste soll
class TParameter
{
     public double a = 0.0;
     public double b = 0.0;
     public string sName = "";

     public TParameter(double da, double db, string sText)
     {
          a = da;
          b = db;
          sName = sText;
     }
}

// Liste erzeugen
List<TParameter> Parameters = new List<TParameter>();

// Element hinzufügen
Parameters.Add(new TParameter(0.2, 0.4, "P1"));

// erstes Element der Liste holen
TParameter Par = Parameters[0];

// alle Parameter in der Liste durchgehen
foreach (TParameter Par in Parameters)
{
    Par.a = 0.1;
}

// alle Elemente aus der Liste löschen
Parameters.Clear();

// Liste in eine andere gleichen Typs kopieren
Parameters.AddRange(SourceParameterList);

// ersten Parameter suchen, dessen Wert von a > 10.0 ist
TParameter Par = Parameters.Find(delegate(TParameter Par) { return Par.a > 10.0; });

// neue Liste erzeugen in der nur bestimmte Elemente einer alten Liste stehen
List<TParameter> NewParameters = Parameters.FindAll(delegate(TParameter Par) { return Par.a > 10.0; });

// einfache Methode zum Sortieren einer Liste
Parameters.Sort(delegate(TParameter Par1, TParameter Par2) { return Par1.sName.CompareTo(Par2.sName); });
  • eine weitere Methode zum Sortieren von List
using System.Collections.Generic;

// Objekt, dass in die Liste soll
// muß von IComparable abgeleitet sein, damit es über
// CompareTo() bei Aufruf von Sort verglichen werden kann
class TParameter : IComparable
{
     public double a = 0.0;
     public double b = 0.0;

     public TParameter(double da, double db)
     {
          a = da;
          b = db;
     }

     public int CompareTo(Object o) 
     {
        TParameter P = o as TParameter;

        int iRetVal = 0; // Grundinitialisierung für this.a == ((TParameter)o).a

        if (P != null)
        {
            if (this.a < P.a) iRetVal = -1; // Objekt ist kleiner als das Übergebene 
            else if (this.a > P.a) iRetVal = 1; // Objekt ist größer als das Übergebene
        }
        
        return iRetVal;
     }
}

// Verwendung
List list = new List();
list.Add(new TParameter(0.8, 0.2));
list.Add(new TParameter(0.5, 0.4));
list.Add(new TParameter(0.1, 0.1));
list.Sort(); // ruft CompareTo() auf
foreach (TParameter Par in list) Console.WriteLine(Par.a.ToString()+", "+Par.b.ToString());
  • Ausgabe von Elementen einer Stringliste
using System.Collections.Generic;

List<string> namen = new List<string>() { "Horst", "Ulf", "Jochen" };
string ausgabe = string.Join(", ", namen.ToArray());