我想實現使用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