Ha C # hanno uno std :: equivalente nth_element?
-
23-09-2019 - |
Domanda
Sono porting qualche codice C ++ a C #.
Fa C # hanno un equivalente a std::nth_element()
o ho bisogno di rotolare mio?
Soluzione
presumo siete alla ricerca di una funzione di accesso che restituisce l'elemento ennesimo di una collezione non ordinata eseguendo un parziale sorta sulla raccolta. Questo tende ad essere utile quando si dispone di una grande raccolta e sono interessati in uno dei primi elementi sulla base di alcuni ordini predicato.
A mia conoscenza, né la BCL .NET o estensioni LINQ offrono un equivalente. Tutti i metodi di ordinamento (compresi i Enumerable.OrderBy) eseguire un ordinamento completo della collezione.
Se avete bisogno di una versione efficiente della N, dovrai rotolare il proprio metodo di estensione su IEnumerable a farlo. Se avete intenzione di rotolare si possiede si potrebbe voler esaminare la rel="nofollow Selezione rapida algoritmo , che ha O (n) le prestazioni.
Se la versione a forza bruta è sufficiente, è possibile utilizzare 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();
}
}
Altri suggerimenti
No, non è così. Dovrete scrivere l'algoritmo di selezione (preferibilmente Selezione rapida ) a mano.
Non c'è un equivalente diretto. Si potrebbe, potenzialmente, utilizzare OrderBy di LINQ e Take / Vai ai acheive gli stessi obiettivi su qualsiasi IEnumerable, ma l'intera collezione sarà possibile ottenere ordinati in questo processo.