Frage

ich einige C ++ Code in C # zu portieren.

Does C # ein Äquivalent zu std::nth_element() oder muss ich zu rollen müssen mein eigenes?

War es hilfreich?

Lösung

Ich nehme an, Sie suchen nach einem Accessor, dass kehrt das N-te Element einer ungeordneten Sammlung durch eine Teil Art der Durchführung auf der Sammlung. Dies führt dazu nützlich zu sein, wenn Sie eine sehr große Sammlung haben und in einem der ersten Elemente basierend auf einem gewissen Ordnung Prädikat interessiert sind.

Mein Wissen weder die .NET BCL oder LINQ-Erweiterungen bieten eine gleichwertige. Alle Sortiermethoden (einschließlich Enumerable.OrderBy) führen Sie eine vollständige Ordnung der Sammlung.

Wenn Sie eine effiziente Version von Nth benötigen, müssen Sie Ihre eigene Erweiterungsmethode auf IEnumerable rollen, dies zu tun. Wenn Sie Rolle werden Sie besitzen Sie können in die Quick Select-Algorithmus suchen möchten, die hat O (n) Leistung.

Wenn die Brute-Force-Version ausreichend ist, könnten Sie LINQ verwenden:

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();
    }
}

Andere Tipps

Nein, tut es nicht. Sie werden den Auswahlalgorithmus schreiben (vorzugsweise schnell wählen ) von Hand.

Es gibt keine direkte Entsprechung. Sie könnten möglicherweise auch SortiertNach die Verwendung von LINQ und Take / Überspringen die gleichen Ziele auf jedem IEnumerable acheive, sondern die gesamte Kollektion wird in diesem Prozess sortiert erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top