Algorithmen und Datenstrukturen in C#: In der Praxis
\n\nDas Verständnis von Algorithmen und Datenstrukturen ist eine grundlegende Fähigkeit für jeden Entwickler. Unabhängig davon, ob Sie einen hochbelasteten Dienst, eine Desktop-Anwendung oder ein Spiel schreiben, beeinflusst eine effiziente Datenverwaltung direkt die Leistung und Skalierbarkeit Ihres Codes. In diesem Artikel werden wir die wichtigsten Datenstrukturen und Algorithmen in der Sprache C# (.NET) mit praktischen Beispielen durchgehen, die Sie sofort in Ihren Projekten anwenden können.
\n\n1. Dynamische Arrays und Arbeiten mit List<T>
\n\nIn C# ist die grundlegende dynamische Array-Klasse List<T>. Im Gegensatz zu einem klassischen Array wird es beim Hinzufügen von Elementen automatisch erweitert. Betrachten wir seine wichtigsten Operationen und eine der wichtigsten – die binäre Suche.
Binäre Suche (Binary Search) funktioniert nur auf sortierten Daten. Ihre Komplexität beträgt O(log n). Der Algorithmus teilt den Suchbereich bei jedem Schritt in zwei Hälften.
\n\nusing System;\nusing System.Collections.Generic;\n\npublic class BinarySearchExample\n{\n public static int BinarySearch(List<int> sortedList, int target)\n {\n int left = 0;\n int right = sortedList.Count - 1;\n\n while (left <= right)\n {\n int mid = left + (right - left) / 2;\n\n if (sortedList[mid] == target)\n return mid; // Element gefunden, Index zurückgeben\n else if (sortedList[mid] < target)\n left = mid + 1; // In der rechten Hälfte suchen\n else\n right = mid - 1; // In der linken Hälfte suchen\n }\n return -1; // Element nicht gefunden\n }\n\n public static void Main()\n {\n var numbers = new List<int> { 2, 5, 8, 12, 16, 23, 38, 45, 56, 67 };\n int target = 23;\n int result = BinarySearch(numbers, target);\n Console.WriteLine(result != -1 ? $"Element {target} gefunden an Index {result}" : "Element nicht gefunden");\n }\n}\n\nWarum ist das wichtig? List<T> wird in 90% der Projekte verwendet. Die Fähigkeit, schnell darin zu suchen, ist der Schlüssel zur Leistung.
\n\n2. Stack und Queue: LIFO und FIFO in der Praxis
\n\nStack und Queue sind Sammlungen mit einer klar definierten Zugriffsreihenfolge. Sie sind unverzichtbar bei der Verarbeitung von Aufrufen, der Syntaxanalyse und der Arbeit mit Aufgaben.
\n\nStack (LIFO – Last In, First Out)
\nWird beispielsweise verwendet, um die korrekte Klammerung im Code zu überprüfen.
\n\nusing System;\nusing System.Collections.Generic;\n\npublic class StackExample\n{\n public static bool IsValidBrackets(string input)\n {\n Stack<char> stack = new Stack<char>();\n foreach (char ch in input)\n {\n if (ch == '(' || ch == '{' || ch == '[')\n {\n stack.Push(ch);\n }\n else if (ch == ')' || ch == '}' || ch == ']')\n {\n if (stack.Count == 0) return false;\n\n char top = stack.Pop();\n if ((ch == ')' && top != '(') ||\n (ch == '}' && top != '{') ||\n (ch == ']' && top != '['))\n {\n return false;\n }\n }\n }\n return stack.Count == 0;\n }\n\n public static void Main()\n {\n string test1 = "({[]})";\n string test2 = "({[})";\n Console.WriteLine($"'{test1}' — korrekte Klammern: {IsValidBrackets(test1)}");\n Console.WriteLine($"'{test2}' — korrekte Klammern: {IsValidBrackets(test2)}");\n }\n}\n\nQueue (FIFO – First In, First Out)
\nIdeal geeignet für die Verarbeitung von Aufgaben in der Reihenfolge ihres Eingangs (z. B. Druckwarteschlange).
\n\nusing System;\nusing System.Collections.Generic;\n\npublic class QueueExample\n{\n public static void Main()\n {\n