Pregunta

Estoy portar algún código C ++ a C #.

¿El C # tiene un equivalente a std::nth_element() o necesito a rollo mi propia?

¿Fue útil?

Solución

supongo que busca un descriptor de acceso que devuelve el enésimo elemento de una colección desordenada mediante la realización de un parcial de ordenación en la colección. Esto tiende a ser útil cuando se tiene una colección muy grande y está interesado en uno de los primeros elementos en función de algún predicado pedido.

Que yo sepa, ni el BCL .NET o extensiones de LINQ ofrecen un equivalente. Todos los métodos de clasificación (incluyendo Enumerable.OrderBy) realizar una ordenación completa de la colección.

Si necesita una versión eficiente de la enésima, tendrá que rodar su propio método de extensión en IEnumerable para hacerlo. Si va a rollo es el propietario puede que desee ver en la rápida Seleccionar algoritmo , que tiene O (n) rendimiento.

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

Otros consejos

No, no lo hace. Vas a tener que escribir el algoritmo de selección (preferiblemente rápida seleccione ) con la mano.

No hay un equivalente directo. Se podría, potencialmente, OrdenarPor uso de LINQ y Take / Saltar a acheive los mismos objetivos en cualquier IEnumerable, pero toda la colección conseguirá ordenados en este proceso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top