Pergunta

Estou portando algum código C ++ para C#.

C# tem um equivalente a std::nth_element() Ou eu preciso rolar o meu?

Foi útil?

Solução

Presumo que você esteja procurando um acessador que retorne o enésimo elemento de uma coleção não ordenada, executando um derivado parcial na coleção. Isso tende a ser útil quando você tem uma coleção muito grande e está interessado em um dos primeiros elementos com base em algum predicado de pedidos.

Que eu saiba, nem as extensões .NET BCL ou LINQ oferecem um equivalente. Todos os métodos de classificação (incluindo enumerable.orderby) realizam uma ordem completa da coleção.

Se você precisar de uma versão eficiente do NTH, precisará rolar seu próprio método de extensão no IENUMERABER para fazê -lo. Se você vai rolar você, você pode querer olhar para o Algoritmo de seleção rápida, que tem desempenho O (n).

Se a versão da força bruta for suficiente, você poderá usar o 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();
    }
}

Outras dicas

Não, não. Você terá que escrever o algoritmo de seleção (de preferência Seleção rápida) à mão.

Não há um equivalente direto. Você pode, potencialmente, usar a Orderby da Linq e pegar/pular para alcançar os mesmos objetivos em qualquer ienumerable, mas toda a coleção será classificada nesse processo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top