2010-03-29 20 views

Respuesta

8

Supongo que está buscando un descriptor de acceso que devuelva el elemento N-ésimo de una colección desordenada realizando una clasificación parcial en la colección. Esto tiende a ser útil cuando tiene una colección muy grande y le interesa uno de los primeros elementos basado en algún predicado de ordenamiento.

Que yo sepa, ni las extensiones .NET BCL o LINQ ofrecen un equivalente. Todos los métodos de clasificación (incluido Enumerable.OrderBy) realizan un ordenamiento completo de la colección.

Si necesita una versión eficiente de Nth, tendrá que pasar su propio método de extensión en IEnumerable para hacerlo. Si va a rodar su propia cuenta, puede consultar el Quick Select algorithm, que tiene un rendimiento O (n).

Si la versión de fuerza bruta es suficiente, se puede utilizar 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(); 
    } 
} 
3

No, no es así. Tendrá que escribir el algoritmo de selección (preferiblemente quick select) a mano.

1

No hay un equivalente directo. Podría, potencialmente, utilizar OrderBy y Take/Skip de LINQ para lograr los mismos objetivos en cualquier IEnumerable, pero se ordenará la colección completa en este proceso.

+0

Me pregunto si, en el caso de 'OrderBy' se implementa funcionalmente (por ejemplo, por tipo de combinación), la combinación de' take/skip' plus * evaluación diferida * en realidad no solo realizará un tipo ** parcial ** de acuerdo a lo pedido. 'head (sort list))' en Haskell, por ejemplo, es un método O (n) válido para encontrar el mínimo de una lista. ¿Algún consejo? – Dario

+0

@Dario: Teóricamente, podría ~, pero la implementación actual no. –

+0

Hubiera sido divertido :) – Dario

Cuestiones relacionadas