我想实现使用C#使用LINQ的功能风格的快速排序,并且此代码随机工作/不工作,我不明白为什么。
重要提醒:当我在数组或列表上调用它时,它工作正常。可是,在一个未知的 - 什么 - 它,真的,是IEnumerable的,它会疯狂(失去价值或崩溃,通常,有时作品。)
代码:C#功能快速排序失败
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; }
你能找到的任何故障这会导致这个失败?
编辑:一些更好的测试代码:
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); }
你是什么意思'未知 - 它真的是IEnumerable'?这是一个通用的方法,所以你的对象的类型总是已知的。 – 2010-04-24 14:32:17
我的意思是我不知道IEnumerable shell下面是什么。这是一个列表吗?数组?我尝试过的和失败的是从一个列表中,我基本上做了“Random rand = ...; int [100] .Select(a => rand.Next());” – Rubys 2010-04-24 14:41:03