2012-02-16 4 views
5

Vorrei un codice LINQ pulito che possa ottenere una matrice dei valori dell'indice dei primi 1000 valori massimi all'interno di un array.Ottieni i valori di indice degli array delle 1000 voci più grandi all'interno di un array utilizzando LINQ

Ad esempio:

int[] IndexArray = ArrayWithValues.Return_Indexes_Of_1000_Biggest_Values 

Il codice è ovviamente fasullo è solo per illustrare quello che mi serve.

UPDATE

ho completamente dimenticato di dire che ho bisogno di una seconda funzionalità. Ho un secondo array e ho bisogno di recuperare tutti i valori nel secondo array che ha gli stessi indici contenuti all'interno del IndexArray.

Posso farlo facilmente utilizzando i loop e tutto questo ma il codice è grande, e voglio imparare a usare LINQ più spesso ma al momento LINQ è ancora molto estraneo a me.

Ho risposto a domande simili poste qui, ma non ero in grado di modificare il codice per soddisfare le mie esigenze, poiché le persone solitamente hanno solo bisogno dei valori e non degli indici dei valori.

Grazie per l'aiuto!

+0

Per l'aggiornamento: 'var itemsFromSecondArray = indexArray.Select (i => secondArray [i]). ToArray()', oppure puoi selezionarli dall'espressione 'indexArray' se non hai effettivamente bisogno' indexArray' altrimenti. – Rup

risposta

7

Qualcosa di simile dovrebbe funzionare. Utilizza il sovraccarico di Select che consente di incorporare un secondo input che è l'indice dell'elemento nella sequenza.

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

semplicemente proiettare il valore e l'indice in un oggetto, ordine per il valore, prendere i primi 1000 elementi, e quindi selezionare semplicemente gli indici prima della conversione in un array.

Il test prendendo i primi 5 indici dall'array { 10, 4, 6, 8, 2, 3, 5, 1, 9, 7 } produce { 0, 8, 3, 9, 2 }, che corrisponde ai valori { 10, 9, 8, 7, 6 }.


come i commenti hanno già affrontato per quanto riguarda l'aggiornamento, si può semplicemente prendere questi indici di scegliere tra l'altro, se si è sicuri gli array sono uguali in lunghezza o saranno altrimenti non tradurrà in un IndexOutOfBoundsException.

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

Un altro metodo si potrebbe guardare in alto sarebbe Enumerable.Zip.

+0

Grazie, ha funzionato, ma ho completamente dimenticato di aver bisogno di qualcos'altro in seguito, per favore leggi l'aggiornamento – user1035217

+2

@ user1035217: cambia semplicemente l'ultima opzione 'Seleziona' in' Seleziona (elemento => altroArray [elemento.indice]) '. –

+0

Mmm pensava che sarebbe stato così facile. Linq è davvero fantastico. Grazie! – user1035217

Problemi correlati