Algorithmes et structures de données en C# : en pratique
\n\nLa compréhension des algorithmes et des structures de données est une compétence fondamentale pour tout développeur. Que vous écriviez un service à forte charge, une application de bureau ou un jeu, une gestion efficace des données influence directement les performances et l'évolutivité de votre code. Dans cet article, nous analyserons les structures de données et algorithmes clés en langage C# (.NET) avec des exemples pratiques que vous pourrez immédiatement appliquer dans vos projets.
\n\n1. Tableaux dynamiques et travail avec List<T>
\n\nEn C#, le tableau dynamique de base est la classe List<T>. Contrairement au tableau classique, il s'étend automatiquement lors de l'ajout d'éléments. Examinons ses opérations clés et l'une des plus importantes — la recherche binaire.
Recherche binaire (Binary Search) fonctionne uniquement sur des données triées. Sa complexité est O(log n). L'algorithme divise la plage de recherche en deux à chaque étape.
\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; // Élément trouvé, retourne l'index\n else if (sortedList[mid] < target)\n left = mid + 1; // Cherche dans la moitié droite\n else\n right = mid - 1; // Cherche dans la moitié gauche\n }\n return -1; // Élément non trouvé\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 ? $"Élément {target} trouvé à l'index {result}" : "Élément non trouvé");\n }\n}\n\nPourquoi est-ce important ? List<T> est utilisé dans 90% des projets. Savoir rechercher rapidement des données dedans est la clé de la performance.
\n\n2. Pile et File d'attente : LIFO et FIFO en pratique
\n\nLa pile (Stack) et la file d'attente (Queue) sont des collections avec un ordre d'accès clairement défini. Elles sont indispensables pour le traitement des appels, l'analyse syntaxique et le travail avec les tâches.
\n\nPile (LIFO — Last In, First Out)
\nUtilisée par exemple pour vérifier la validité des parenthèses dans le code.
\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}' — parenthèses correctes : {IsValidBrackets(test1)}");\n Console.WriteLine($"'{test2}' — parenthèses correctes : {IsValidBrackets(test2)}");\n }\n}\n\nFile d'attente (FIFO — First In, First Out)
\nIdéale pour traiter les tâches dans l'ordre de leur arrivée (par exemple, file d'impression).
\n\nusing System;\nusing System.Collections.Generic;\n\npublic class QueueExample\n{\n public static void Main()\n {\n