C# 是否有等效的 std::nth_element ?
-
23-09-2019 - |
题
我正在将一些 C++ 代码移植到 C#。
C# 有等价的吗 std::nth_element()
还是我需要自己动手?
解决方案
我假设您正在寻找一个通过对集合执行部分排序来返回无序集合的第 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();
}
}
其他提示
没有,它没有。你必须写选择算法(最好快速选择)手。
有不是直接等同物。你可以潜在地,使用LINQ的排序依据和Take /跳到acheive任何的IEnumerable相同的目标,但整个系列将在这个过程中得到排序。
不隶属于 StackOverflow