Sto cercando di attuare Quicksort in uno stile funzionale utilizzando C# utilizzando LINQ, e questo codice funziona in modo casuale/non funziona, e non riesco a capire perché.
Importante ricordare: quando lo chiamo su un array o un elenco, funziona correttamente. Ma su una sconosciuta-ciò-che-davvero-è IEnumerable, si impazzisce (perde valori o si blocca, di solito a volte funziona..)
Il codice:C# quicksort funzionale sta venendo a mancare
public static IEnumerable<T> Quicksort<T>(this IEnumerable<T> source) where T : IComparable<T> { if (!source.Any()) yield break; var pivot = source.First(); var sortedQuery = source.Skip(1).Where(a => a.CompareTo(source.First()) <= 0).Quicksort() .Concat(new[] { pivot }) .Concat(source.Skip(1).Where(a => a.CompareTo(source.First()) > 0).Quicksort()); foreach (T key in sortedQuery) yield return key; }
si può trovare alcun difetto qui che farebbe fallire questo?
Edit: Alcuni codice di prova migliore:
var rand = new Random(); var ienum = Enumerable.Range(1, 100).Select(a => rand.Next()); var array = ienum.ToArray(); try { array.Quicksort().Count(); Console.WriteLine("Array went fine."); } catch (Exception ex) { Console.WriteLine("Array did not go fine ({0}).", ex.Message); } try { ienum.Quicksort().Count(); Console.WriteLine("IEnumerable went fine."); } catch (Exception ex) { Console.WriteLine("IEnumerable did not go fine ({0}).", ex.Message); }
Cosa intendi per "sconosciuto-cosa-realmente-è IEnumerable" ?? Questo è un metodo generico, quindi i tipi di oggetto sono sempre noti. –
Voglio dire che non so cosa sia sotto la shell IEnumerable. È una lista? un array? Quello che ho provato e quello che ho fallito è stato da una lista in cui ho praticamente fatto "Random rand = ...; int [100] .Select (a => rand.Next());" – Rubys