J'essaie d'implémenter le quicksort dans un style fonctionnel en utilisant C# en utilisant linq, et ce code fonctionne aléatoirement/ne fonctionne pas, et je ne peux pas comprendre pourquoi.
Important à mentionner: Lorsque je l'appelle sur un tableau ou une liste, cela fonctionne très bien. Mais sur un inconnu-ce-it-vraiment-est IEnumerable, il devient fou (perd des valeurs ou des accidents, en général fonctionne parfois..)
Le code:Le quicksort fonctionnel C# échoue
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; }
Pouvez-vous trouver des défauts ici cela ferait échouer cela?
Edit: Certains meilleur code de test:
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); }
Que voulez-vous dire 'unknown-what-it-really-is IEnumerable' ?? C'est une méthode générique, donc les types de vos objets sont toujours connus. –
Je veux dire que je ne sais pas ce qui se trouve sous le shell IEnumerable. Est-ce une liste? un tableau? Ce que j'ai essayé et ce qui a échoué était d'une liste où j'ai fait fondamentalement "Random rand = ...; int [100] .Select (a => rand.Next());" – Rubys