13

いくつかのC++コードをC#に移植しています。

C#には同等のものがstd::nth_element()ありますか、それとも自分でロールする必要がありますか?

4

3 に答える 3

8

コレクションに対して部分ソートを実行することにより、順序付けされていないコレクションのN番目の要素を返すアクセサーを探していると思います。これは、コレクションが非常に大きく、順序付け述語に基づく最初の要素の1つに関心がある場合に役立つ傾向があります。

私の知る限り、.NETBCL拡張機能と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 に答える