Estoy tratando de implementar quicksort en un estilo funcional usando C# utilizando linq, y este código funciona al azar/no funciona, y no puedo entender por qué.
Importante mencionar: Cuando llamo esto a una matriz o lista, funciona bien. Pero en un desconocido-lo-que-realmente-se IEnumerable, que se vuelve loco (pierde los valores o se bloquea, por lo general funciona a veces..)
El código:C# quicksort funcional está fallando
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; }
¿Se puede encontrar fallos aquí eso causaría que esto fallara?
Editar: Algunos mejor código de prueba:
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); }
¿Qué quiere decir 'unknown-what-it-really-is IEnumerable' ?? Este es un método genérico, por lo que los tipos de su objeto son siempre conocidos. –
Quiero decir que no sé qué hay debajo del shell IEnumerable. ¿Es una lista? ¿una matriz? Lo que probé y lo que falló fue de una lista en la que básicamente hice "Random rand = ...; int [100] .Select (a => rand.Next());" – Rubys