c# - 使用 LINQ 进行快速排序

标签 c# linq generics

我正在使用 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和通用版本所以这应该有效?

最佳答案

问题是您对 >= 的使用(即:首先是 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

关于c# - 使用 LINQ 进行快速排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26894850/

相关文章:

c# - 如何在不按 Tab 的情况下强制 DataGridView 当前单元格轮廓

c# - gridview Devexpress C#

c# - 使用 linq 在 C# 中从一个类合并并映射到另一个类

c# - WPF中如何将数据绑定(bind)到gridcontrol

c# - 如何检测 T 是否为 IEnumerable<T2>,如果是则获取 T2 的类型?

c# - 如果需要,将方案添加到 URL

c# - 如何使用打印对话框

c# - 如何检测 C# LINQ 查询中没有返回数据

generics - 如何在 "where"子句中给出表达式泛型类型?

java - 泛型错误 : not applicable for the arguments