C# 什么';围绕枢轴过滤序列的最佳LINQ方法是什么?

C# 什么';围绕枢轴过滤序列的最佳LINQ方法是什么?,c#,linq,quicksort,C#,Linq,Quicksort,我正在使用快速排序和LINQ,并希望将序列分为轴之前、等于和之后的项目 以下是我目前掌握的情况: public static Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>> ComparativeWhere<T>(this IEnumerable<T> source, T t) where T : IComparable<T>

我正在使用快速排序和LINQ,并希望将序列分为轴之前、等于和之后的项目

以下是我目前掌握的情况:

    public static Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>> ComparativeWhere<T>(this IEnumerable<T> source, T t)
        where T : IComparable<T>
    {
        return new Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>>(
            source.Where(x => x.CompareTo(t) < 0),
            source.Where(x => x.CompareTo(t) == 0),
            source.Where(x => x.CompareTo(t) > 0)
            );
    }
公共静态元组ComparativeWhere(此IEnumerable源代码,T)
其中T:i可比较
{
返回新元组(
其中(x=>x.CompareTo(t)<0),
其中(x=>x.CompareTo(t)==0),
其中(x=>x.CompareTo(t)>0)
);
}

最好的方法是什么?这是最好的实现,还是有更好的实现?或者我应该使用一个我不知道的库函数吗?

嘿,Jay,Wes Dyer关于这个的文章可能会对你有所帮助


如果性能是一个问题(在排序时通常是这样,尽管这只是为了好玩),我建议可能不要使用任何内置的东西,因为这样做的方式是调用Where 3次,这会导致枚举被迭代3次。我会这样做:

public static Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>> ComparativeWhere<T>(this IEnumerable<T> source, T t)
where T : IComparable<T>
{

    var list1 = new List<T>();
    var list2 = new List<T>();
    var list3 = new List<T>();

    foreach (var item in source)
    {
        if (item.CompareTo(t) < 0)
        {
            list1.Add(item);
        }

        if (item.CompareTo(t) == 0)
        {
            list2.Add(item);
        }

        if (item.CompareTo(t) > 0)
        {
            list3.Add(item);
        }
    }

    return new Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>>(list1, list2, list3);
}
公共静态元组ComparativeWhere(此IEnumerable源代码,T)
其中T:i可比较
{
var list1=新列表();
var list2=新列表();
var list3=新列表();
foreach(源中的var项)
{
如果(项目比较(t)<0)
{
清单1.添加(项目);
}
如果(项目比较(t)==0)
{
清单2.添加(项目);
}
如果(项目比较(t)>0)
{
清单3.添加(项目);
}
}
返回新的元组(列表1、列表2、列表3);
}

当然,这种方法的两个缺点是,您创建了3个新列表,并且不再懒散地执行,但生活中的一切都是一种权衡,不是吗?:)

你应该使用
OrderBy
。是的,我相信
OrderBy
是最好的排序方式。实际上,我在这里尝试实现
快速排序
是为了好玩。虽然我很喜欢Linq,但用它来实现快速排序并不是一个好主意,我想。。。您可能最终会遇到一个SlowSort;)是的,你可能是对的。实际上,我想知道一个划分序列的方法是否有趣或有用,而不管快速排序的适用性如何,但我似乎已经在一个阻止这种情况发生的例子中提出了这个问题。