使用LINQ进行快速排序

本文关键字:快速排序 LINQ 使用 | 更新日期: 2023-09-27 18:30:07

我正在使用LINQ和泛型开发一个基本的快速排序算法,但我遇到了一些问题,主要是类型推理。

这是代码

private static List<T> Quicksort<T>(IEnumerable<T> list) 
            where T : IComparable, IComparable<T>
        {
            if (!list.Any()) 
                return new List<T>();
            var first = list.First();
            var smallerAndLarger = list.Skip(1).GroupBy(n => n >= first);
            return new List<T>
                (Quicksort(smallerAndLarger.Where(x => !x.Key)).Add(first))
                .AddRange(Quicksort(smallerAndLarger.Where(x => x.Key)));
        }

编译器抱怨这行

var smallerAndLarger = list.Skip(1).GroupBy(n => n >= first);

说类型T不支持比较操作,但我已经在方法签名中设置了T应该实现IComparable和泛型版本,所以这应该有效吗?

使用LINQ进行快速排序

问题是使用>=(即:n=>n>=第一个),除非类型定义了如何使用运算符,否则它不可用(IComparable没有)。

不要使用gt/lt/eq运算符,而是使用CompareTo(http://msdn.microsoft.com/en-us/library/system.icomparable.compareto(v=vs.110).aspx)以确定优先级:

n => n.CompareTo(first) >= 0