¿Es C# bueno para estructuras de datos y algoritmos?
Sí. Se lee de forma muy parecida a Java: los tipos hacen explícitos cada nodo, cada referencia y cada parámetro genérico, y System.Collections.Generic cubre la mayoría de las estructuras de esta ruta. Conviene adquirir pronto dos hábitos. LINQ es conciso, pero cada OrderBy es un ordenamiento y cada Where un bucle, así que oculta los costes que estás aprendiendo a contar; y Array.Sort no es estable, lo que importa siempre que las claves iguales deban conservar su orden.
¿Qué colecciones de .NET corresponden a qué estructuras de datos?
List<T> es un array dinámico, Stack<T> y Queue<T> se implementan sobre arrays, LinkedList<T> es una lista doblemente enlazada, Dictionary<TKey,TValue> y HashSet<T> son tablas hash, y SortedDictionary<TKey,TValue> y SortedSet<T> son árboles rojo-negro, balanceados como el árbol AVL que construyes en el paso dos. SortedList<TKey,TValue> es un par de arrays mantenidos en orden de clave, y desde .NET 6 PriorityQueue<TElement,TPriority> es un min-heap implementado sobre un array. No hay ninguna clase de trie ni de grafo; esos los escribes tú.
¿Un nodo de árbol o de lista debe ser una clase o un struct en C#?
Una clase. Un struct es un tipo de valor: no puede contener en absoluto un campo de su propio tipo y, allí donde se copia, un cambio en la copia deja intacto el original. Una instancia de clase es una referencia, así que los nodos pueden apuntarse entre sí como lo necesitan una lista enlazada o un árbol. Reserva los structs para valores pequeños, como una coordenada de una cuadrícula o una arista con peso.
¿Tiene C# una cola de prioridad?
Desde .NET 6, sí: PriorityQueue<TElement,TPriority>, un min-heap implementado sobre un array en el que cada elemento se encola con su propia prioridad; pasa un IComparer<TPriority> que invierta el orden para obtener un max-heap. .NET Framework y los runtimes anteriores no tienen ninguna, por eso durante mucho tiempo los desarrolladores de C# escribían su propio heap o adaptaban un SortedSet<T> para que hiciera de uno, y por eso sigue importando saber escribirlo. El paso dos es donde lo haces.
¿Qué cursos de esta ruta no se enseñan en C#?
Tres: la programación dinámica y la serie de entrevistas en Python, que se enseñan en Python, y la manipulación de bits, que se enseña en C++. Aparecen después de los pasos, cada uno con un enlace que lo abre en su propio lenguaje. Una tabla de memoización en C# es un array o un Dictionary, y los trucos de bits se trasladan sin problemas, hasta en la distinción que hace C++: >> conserva el signo en un int y rellena con ceros en un uint.
¿Necesito saber C# antes de empezar esta ruta?
Como mínimo, clases, métodos, arrays, bucles y colecciones genéricas como List<T>. Si son nuevos para ti, el curso de C# de Coddy te lleva hasta ahí primero, gratis, y esta ruta continúa donde él termina.