我正在将一些C ++代码移植到C#。
C#是否等同于std::nth_element()
或者我需要自己滚动吗?
答案 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上实现相同的目标,但整个集合将在此过程中进行排序。