C#是否有std :: nth_element等价物?

时间:2010-03-29 19:15:34

标签: c# c++ stl nth-element

我正在将一些C ++代码移植到C#。

C#是否等同于std::nth_element()或者我需要自己滚动吗?

3 个答案:

答案 0 :(得分:8)

我认为你正在寻找一个访问者,它通过对集合执行部分排序来返回无序集合的第N个元素。当你有一个非常大的集合时,这会很有用。感兴趣的是基于某些排序谓词的第一个元素之一。

据我所知,.NET BCL或LINQ扩展都不提供等价物。所有排序方法(包括Enumerable.OrderBy)都执行集合的完整排序。

如果您需要Nth的高效版本,则需要在IEnumerable上滚动自己的扩展方法来执行此操作。如果您要自己滚动,可能需要查看具有O(n)性能的Quick Select algorithm

如果蛮力版本足够,您可以使用LINQ:

var someCollection = new []{ 5, 2, 8, 9, 0, 1, 3, 12, 4 };

var fifthItem = someCollection.NthItem(5);

public static class NthExtensions 
{
    public static T NthItem(this IEnumerable<T> coll, int n) 
    {
        return coll.OrderBy(x => x).Skip(n - 1).First();
    }
}

答案 1 :(得分:3)

不,它没有。您必须手动编写选择算法(最好quick select)。

答案 2 :(得分:1)

没有直接的等价物。您可以使用LINQ的OrderBy和Take / Skip在任何IEnumerable上实现相同的目标,但整个集合将在此过程中进行排序。