Question

Je suis un peu le portage C ++ code C #.

Est-ce que C # ont un équivalent à std::nth_element() ou dois-je rouler mon?

Était-ce utile?

La solution

Je suppose que vous êtes à la recherche d'un accesseur qui retourne l'élément Nième d'une collection non ordonnée en effectuant un tri partiel sur la collection. Ceci tend à être utile lorsque vous avez une très grande collection et sont intéressés à l'un des premiers éléments en fonction de certains prédicats de commande.

A ma connaissance, ni la BCL .NET ou extensions LINQ offrent un équivalent. Toutes les méthodes de tri (y compris Enumerable.OrderBy) effectuer une commande complète de la collection.

Si vous avez besoin d'une version efficace de Nth, vous devrez rouler votre propre méthode d'extension sur IEnumerable de le faire. Si vous allez vous rouler possédez vous pouvez regarder dans le Sélection rapide algorithme qui a O (n) performance.

Si la version force brute est suffisante, vous pouvez utiliser 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();
    }
}

Autres conseils

Non, il ne fonctionne pas. Vous devez écrire l'algorithme de sélection ( rapide de sélection ) à la main.

Il n'y a pas d'équivalent direct. Vous pouvez, potentiellement, utiliser OrderBy de LINQ et Take / Aller à acheive les mêmes objectifs sur un IEnumerable, mais la collection se organisait ensemble dans ce processus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top