【发布时间】:2011-02-11 21:13:01
【问题描述】:
我正在尝试使用 linq 使用 C# 以功能样式实现快速排序,而这段代码随机工作/不工作,我不知道为什么。
重要的是要提到:当我在数组或列表上调用它时,它工作正常。但是在未知的 IEnumerable 上,它会变得疯狂(通常会丢失值或崩溃。有时会起作用。)
代码:
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); }
【问题讨论】:
-
unknown-what-it-really-is IEnumerable是什么意思??这是一个通用方法,因此您的对象的类型始终是已知的。 -
我的意思是我不知道 IEnumerable shell 下是什么。是清单吗?数组?我尝试的和失败的来自一个列表,我基本上做了“Random rand = ...; int[100].Select(a=>rand.Next());”
标签: c# linq functional-programming quicksort