13

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

C# 是否有等价物std::nth_element()或者我需要自己推出?

4

3 回答 3

8

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

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

如果您需要 Nth 的高效版本,则需要在 IEnumerable 上滚动您自己的扩展方法。如果您打算自己动手,您可能需要研究具有 O(n) 性能的快速选择算法。

如果蛮力版本足够,您可以使用 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();
    }
}
于 2010-03-29T19:19:16.657 回答
3

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

于 2010-03-29T19:18:01.357 回答
1

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

于 2010-03-29T19:21:11.710 回答