2012-02-16 17 views
5

Me gustaría tener un buen código LINQ limpio que pueda obtener una matriz de valores de índice de los 1000 valores más altos dentro de una matriz.Obtener valores de índice de matriz de las 1000 entradas más grandes dentro de una matriz usando LINQ

Por ejemplo:

int[] IndexArray = ArrayWithValues.Return_Indexes_Of_1000_Biggest_Values 

El código es obviamente falsos es sólo para ilustrar lo que necesito.

ACTUALIZACIÓN

totalmente me olvidaba decir que necesito una segunda funcionalidad. Tengo una segunda matriz y necesito recuperar todos los valores en la segunda matriz que tiene los mismos índices que figuran dentro de IndexArray.

Lo puedo hacer fácilmente usando bucles y todo eso, pero el código es grande, y quiero aprender a usar LINQ más a menudo, pero en este momento LINQ sigue siendo muy extraño para mí.

He recibido preguntas similares, pero no he podido modificar el código para satisfacer mis necesidades, ya que las personas generalmente solo necesitan los valores y no los índices de los valores.

¡Gracias por la ayuda!

+0

Para la actualización: 'var itemsFromSecondArray = indexArray.Select (i => secondArray [i]). ToArray()', o simplemente puede seleccionarlos de la expresión 'indexArray' si realmente no necesita' indexArray' de lo contrario. – Rup

Respuesta

7

Algo como esto debería funcionar. Utiliza la sobrecarga de Select que le permite incorporar una segunda entrada que es el índice del elemento en la secuencia.

var indexArray = sourceArray 
        .Select((value, index) => new { value, index }) 
        .OrderByDescending(item => item.value) 
        .Take(1000) 
        .Select(item => item.index) 
        .ToArray(); 

Simplemente proyectar el valor y el índice en un objeto, el orden por el valor, tomar las 1000 artículos, y luego seleccionar simplemente los índices antes de la conversión a una matriz.

La prueba tomando los 5 índices superiores de la matriz { 10, 4, 6, 8, 2, 3, 5, 1, 9, 7 } produce { 0, 8, 3, 9, 2 }, que se corresponde con los valores { 10, 9, 8, 7, 6 }.


Como los comentarios ya se han ocupado en lo que respecta a su actualización, sólo tiene que tomar estos índices para seleccionar una de la otra si está seguro de los arreglos son iguales en longitud o de lo contrario van a dar lugar a una IndexOutOfBoundsException.

.Select(item => otherArray[item.index]) 
.ToArray(); 

Otro método que podría mirar hacia arriba sería Enumerable.Zip.

+0

Gracias, funcionó, pero olvidé por completo que necesito algo más después, por favor lea la actualización – user1035217

+2

@ user1035217: simplemente cambie la última 'Seleccionar' por' Seleccionar (elemento => otroArray [elemento.índice]) '. –

+0

Mmm pensó que iba a ser así de fácil. Linq es realmente increíble. ¡Gracias! – user1035217

Cuestiones relacionadas