Fortgeschrittene Grundlagen: LINQ

LINQ (Language Integrated Query) ist eine Erweiterung im .NET Framework, mit welchem spezielle Abfrageausdrücke erstellt werden können. Das Thema LINQ ist sehr komplex und wird Ihnen bei verschiedenen erweiterten Programmierthemen immer wieder begegnen. Die Erweiterung LINQ befindet sich im Namensraum System.Linq.
Hier wollen wir Ihnen ein Beispiel vorstellen, mit welchem eine generische Liste erweitert sortiert werden kann. Diese spezielle Sortierung eignet sich hervorragend für die Sortierung von Objekten, da hier eine Sortierung an Hand einzelner Eigenschaften oder Funktionsrückgabewerten sinnvoll ist. Für eine solche Sortierung benötigen wir die Funktionen OrderBy() und OrderByDescending(). Um eine Liste noch weiter zu sortieren, können wir die Funktionen ThenBy() und ThenByDescending() verwenden. OrderByDescending() und ThenByDescending() führt die Sortierung absteigend durch. Als Übergabeparameter müssen wir das sogenannte Query übergeben. Hierfür notieren wir einen frei wählbaren Variablennamen, gefolgt von einem Pfeiloperator (=>). Hinter dem Pfeiloperator müssen wir nun die Funktion oder Eigenschaft des zu prüfenden (und damit den zu sortierenden) Wert festlegen. Da die Sortierfunktionen ein Objekt des Typs IOrderedEnumerable zurückgibt, muss die Funktion ToList() aufgerufen werden, um wieder eine generische Liste zu erhalten. Im Gegensatz zu der Sort()-Funktion liefert die LINQ-Sortierung eine neue Liste zurück und überschreibt die ursprüngliche Liste nicht.

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;

namespace CSV20.LINQ
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Computer> lComputer = new List<Computer>();

            for (int i = 0; i < 5; i++)
                lComputer.Add(new Computer());

            lComputer[0].FestplattenGröße = 2048;
            lComputer[0].HdmiVorhanden = true;
            lComputer[1].FestplattenGröße = 128;
            lComputer[3].FestplattenGröße = 512;
            lComputer[3].HdmiVorhanden = true;
            lComputer[4].FestplattenGröße = 512;

            // OrderBy() bzw. OrderByDescending() gibt eine neue Liste zurück und verändert die Quell-Liste nicht 
            // Sort() dagegen sortiert und überschreibt die Quell-Liste
            lComputer = lComputer.OrderByDescending(o => o.FestplattenGröße).ThenByDescending(o => o.HdmiVorhanden).ToList();

            foreach (Computer oComputer in lComputer)
                Console.WriteLine(oComputer.Seriennummer);
            
            Console.ReadKey();
        }
    }
}

Computer.cs
using System;

namespace CSV20.LINQ
{
    public class Computer
    {
        private static int iSeriennummerLast = 0;   // letzte Seriennummer, diese wird bei jeder Objekterzeugung hochgezählt (wichtig: "static")
        private int iSeriennummer;                  // aktuelle Seriennumer dieses Objektes
        private int iFestplattenGröße = 256;

        // Eigenschaft kann nicht verändert werden
        public int Seriennummer
        {
            get
            {
                return iSeriennummer;
            }
        }
        public bool HdmiVorhanden { get; set; }
        public int FestplattenGröße
        {
            get
            {
                return iFestplattenGröße;
            }
            set
            {
                if (value >= 32 && value <= 4096)
                    iFestplattenGröße = value;
            }
        }

        public Computer()
        {
            // iSeriennummer wird erhöht und dann (mit dem neuen Wert) der Variable iSerienummer zugewiesen
            iSeriennummer = ++iSeriennummerLast;
            // iSeriennummer = iSeriennummerLast++; würde den alten Wert in der Variable iSeriennumer ablegen
        }
    }
}
Download

LinksRechts