C# va bene per algoritmi e strutture dati?
Sì. Si legge in modo molto simile a Java: i tipi rendono espliciti ogni nodo, riferimento e parametro generico, e System.Collections.Generic copre la maggior parte delle strutture di questo percorso. Conviene prendere presto due abitudini. LINQ è conciso, ma ogni OrderBy è un ordinamento e ogni Where un ciclo, quindi nasconde proprio i costi che stai imparando a contare; e Array.Sort non è stabile, cosa che conta ogni volta che chiavi uguali devono mantenere il loro ordine.
Quali collezioni .NET corrispondono a quali strutture dati?
List<T> è un array dinamico, Stack<T> e Queue<T> sono basate su array, LinkedList<T> è una lista doppiamente concatenata, Dictionary<TKey,TValue> e HashSet<T> sono tabelle hash, e SortedDictionary<TKey,TValue> e SortedSet<T> sono alberi rosso-neri, bilanciati come l'albero AVL che costruisci nel secondo passaggio. SortedList<TKey,TValue> è una coppia di array mantenuti in ordine di chiave, e da .NET 6 PriorityQueue<TElement,TPriority> è un min-heap basato su array. Non esiste una classe per trie o grafi; quelli li scrivi tu.
In C# un nodo di albero o di lista deve essere una classe o una struct?
Una classe. Una struct è un tipo valore: non può contenere affatto un campo del proprio tipo, e ovunque venga copiata, una modifica alla copia lascia intatto l'originale. Un'istanza di classe è un riferimento, quindi i nodi possono puntarsi a vicenda come richiede una lista concatenata o un albero. Tieni le struct per valori piccoli, come una coordinata di una griglia o un arco pesato.
C# ha una coda di priorità?
Da .NET 6, sì: PriorityQueue<TElement,TPriority>, un min-heap basato su array in cui ogni elemento viene accodato con la propria priorità; passa un IComparer<TPriority> che inverte l'ordine per ottenere un max-heap. .NET Framework e i runtime più vecchi non ne hanno, ed è per questo che gli sviluppatori C# a lungo hanno scritto il proprio heap o adattato un SortedSet<T> a quello scopo, e per questo saperne scrivere uno conta ancora. Lo fai nel secondo passaggio.
Quali corsi di questo percorso non sono insegnati in C#?
Tre: la programmazione dinamica e la serie di colloqui in Python, insegnate in Python, e la manipolazione dei bit, insegnata in C++. Sono elencati dopo i passaggi, ognuno con un link che lo apre nel suo linguaggio. Una tabella di memoizzazione in C# è un array o un Dictionary, e i trucchi sui bit si trasferiscono senza problemi, fino alla distinzione che fa il C++: >> mantiene il segno su un int e riempie di zeri su un uint.
Devo conoscere C# prima di iniziare questo percorso?
Almeno classi, metodi, array, cicli e collezioni generiche come List<T>. Se sono argomenti nuovi, il corso di C# di Coddy ti porta prima a quel punto, gratis, e questo percorso riprende da dove finisce.