C# 使用LINQ进行快速排序
我正在使用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
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
作为默认比较器值。