在枢轴周围过滤序列的最佳LINQ方法是什么?

时间:2010-02-23 16:08:05

标签: c# linq quicksort

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

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

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

如果性能是一个问题(当它通常是排序时,虽然这只是为了好玩),我建议可能不会使用任何内置的东西,因为你这样做的方式是你的召唤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);
}

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