C# 使用LINQ进行快速排序

C# 使用LINQ进行快速排序,c#,linq,generics,C#,Linq,Generics,我正在使用LINQ和泛型开发一个基本的快速排序算法,但我遇到了一些问题,主要是类型推断 这是密码 private static List<T> Quicksort<T>(IEnumerable<T> list) where T : IComparable, IComparable<T> { if (!list.Any()) return new Li

我正在使用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)));
        }

说类型
T
将不支持比较操作,但我已经在方法签名中设置了
T
应该实现
IComparable
和泛型版本,这样才能工作?

问题是您使用>=(即:n=>n>=first)除非类型定义了如何使用该运算符,否则它不可用(IComparable不可用)

使用CompareTo()来确定优先级,而不是使用gt/lt/eq运算符:

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

问题在于使用>=(即:n=>n>=first),除非某个类型定义了如何使用运算符(IComparable没有定义),否则该运算符不可用

使用CompareTo()来确定优先级,而不是使用gt/lt/eq运算符:

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

使用GroupBy时,是否要使用Where?使用
IComparable
界面:不要使用
=
运算符,而是使用
CompareTo
方法。或者将
IComparer
作为参数:-
IComparer
类似于该答案中讨论的
IEqualityComparer
接口,只需使用
Comparer.Default
作为默认比较器值。使用GroupBy时,是否要使用Where?使用
IComparable
界面:不要使用
=
运算符,而是使用
CompareTo
方法。或者将
IComparer
作为参数:-
IComparer
类似于该答案中讨论的
IEqualityComparer
接口,只需使用
Comparer.Default
作为默认比较器值。