Domanda

Sono porting qualche codice C ++ a C #.

Fa C # hanno un equivalente a std::nth_element() o ho bisogno di rotolare mio?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top