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

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

C#是否具有std::nth_element()的等价物,还是需要自己滚动?

我假设您正在寻找一个访问器,通过对集合执行部分排序来返回无序集合的第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 coll, int n) { return coll.OrderBy(x => x).Skip(n - 1).First(); } } 

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

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