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

Dre*_*ann 13 c# c++ stl nth-element

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

C#是否具有相同std::nth_element()或者我需要自己滚动?

LBu*_*kin 8

我假设您正在寻找一个访问器,通过对集合执行部分排序来返回无序集合的第N个元素.当你有一个非常大的集合并且对基于某个排序谓词的第一个元素之一感兴趣时,这往往是有用的.

据我所知,.NET BCL或LINQ扩展都没有提供相同的功能.所有排序方法(包括Enumerable.OrderBy)都执行集合的完整排序.

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

如果蛮力版本足够,您可以使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)