← SEARCHABLE ARCHIVE
C# · 2026-08-02

C# von den Grundlagen bis zum Profi — Folge 6

Bearbeiten von Daten mit Sammlungen und LINQ

INTERACTIVE READING MODE →

Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.

Spiele und Apps speichern, durchsuchen und sortieren viele Daten. Die Auswahl einer Sammlung entsprechend dem Zweck und das Ausdrücken der Verarbeitungsabsicht mit LINQ führt zu einem klareren Ablauf und nicht zu einem kürzeren Code.

Sammlung auswählen

var party = new List<Player>();
var itemById = new Dictionary<int, Item>();
var unlockedIds = new HashSet<int>();

itemById.Add(10, new Item(10, "Potion"));
unlockedIds.Add(10);

List eignet sich für geordnete Listen, Dictionary eignet sich für die Schlüsselsuche und HashSet eignet sich zum Bestimmen der Existenz von Werten und zum Verhindern von Duplikaten. Wenn Sie mit einem Indexer einen Schlüssel lesen, der nicht im Wörterbuch enthalten ist, tritt eine Ausnahme auf, sodass Sie TryGetValue verwenden können.

Abfragen mit LINQ

List<Monster> targets = monsters
    .Where(monster => monster.IsAlive)
    .OrderBy(monster => monster.Health)
    .Take(3)
    .ToList();

Die Absicht, drei lebende Monster mit geringer Gesundheit auszuwählen, wird in der Berechnungsreihenfolge angezeigt. LINQ erstellt einen neuen Ergebnisfluss, ohne die ursprüngliche Sammlung automatisch zu ändern.

verzögerte Ausführung

IEnumerable<Monster> alive = monsters.Where(monster => monster.IsAlive);

monsters.Add(new Monster());

foreach (Monster monster in alive)
{
    Console.WriteLine(monster.Health);
}

Die von Where zurückgegebene Abfrage wird normalerweise zum Zeitpunkt des Durchlaufs ausgeführt. Wenn sich das Original in der Mitte ändert, können sich auch die Ergebnisse ändern. Um das aktuelle Ergebnis zu korrigieren, rechnen Sie sofort mit ToList().

Überprüfen Sie wiederkehrende Kosten

LINQ-Aufrufe sind nicht unbedingt langsam, können aber Iteratoren, Delegaten und Ergebnissammlungen erstellen. Für Pfade, die pro Frame tausende Male ausgeführt werden, sind einfache Schleifen und die Wiederverwendung von Puffern möglicherweise besser geeignet.

targets.Clear();
foreach (Monster monster in monsters)
{
    if (monster.IsAlive)
    {
        targets.Add(monster);
    }
}

Erstellen Sie am besten zunächst eine leicht lesbare Abfrage und ändern Sie nur die Abschnitte, in denen bei tatsächlichen Messungen Probleme festgestellt wurden. Der Schlüssel zu Sammlungen und LINQ liegt nicht in der kürzesten Syntax, sondern darin, den Zweck der Datenspeicherung und den Zeitpunkt ihrer Verarbeitung klarzustellen.