2012-02-16 9 views
5

Chciałbym mieć ładny, czysty kod LINQ, który może uzyskać tablicę wartości indeksu największych 1000 największych wartości w tablicy.Uzyskaj wartości indeksu tablicy z 1000 największych wpisów w tablicy za pomocą LINQ

Na przykład:

int[] IndexArray = ArrayWithValues.Return_Indexes_Of_1000_Biggest_Values 

Kod jest oczywiście Bogus to tylko w celu zilustrowania tego, co mi potrzeba.

UPDATE

ja zupełnie zapomniałem powiedzieć, że muszę drugą funkcjonalność. Mam drugą tablicę i muszę pobrać wszystkie wartości z drugiej tablicy, która ma te same indeksy, co zawarte w klasie IndexArray.

Mogę to zrobić z łatwością za pomocą pętli i tak dalej, ale kod jest duży i chcę nauczyć się częściej używać LINQ, ale w tej chwili LINQ wciąż jest dla mnie bardzo obcy.

Przejrzałem podobne pytania, ale nie udało mi się zmodyfikować kodu, aby spełnić moje wymagania, ponieważ ludzie zwykle potrzebują tylko wartości, a nie indeksów wartości.

Dzięki za pomoc!

+0

Dla aktualizacji: 'var itemsFromSecondArray = indexArray.Select (i => secondArray [i]). ToArray()', lub możesz po prostu wybrać je z wyrażenia 'indexArray' jeśli nie potrzebujesz'. indexArray' inaczej. – Rup

Odpowiedz

7

Coś takiego powinno działać. Wykorzystuje przeciążenie z Select, które pozwala na włączenie drugiego wejścia, które jest indeksem elementu w sekwencji.

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

Wystarczy rzutować wartość i wskaźnik do obiektu, zamów przez wartość, podejmuje najlepszymi 1000 elementów, a następnie wybierz po prostu indeksy przed konwersją do tablicy.

Testowanie przez pobranie 5 najlepszych indeksów z tablicy { 10, 4, 6, 8, 2, 3, 5, 1, 9, 7 } daje { 0, 8, 3, 9, 2 }, która odwzorowuje wartości { 10, 9, 8, 7, 6 }.


Ponieważ komentarze zostały już omówione w odniesieniu do aktualizacji, można po prostu wziąć te indeksy, aby wybrać z drugiej, jeśli są przekonani, że tablice są równej długości lub w inny sposób nie będą skutkować IndexOutOfBoundsException.

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

Inną metodą, którą można znaleźć, byłby Enumerable.Zip.

+0

Dziękuję Ci, że to zadziałało, ale zupełnie zapomniałem, że muszę mieć coś jeszcze później, przeczytaj aktualizację – user1035217

+2

@ user1035217: po prostu zmień ostatnie 'Wybierz' na' Wybierz (element => otherArray [item.index]) '. –

+0

Mmm pomyślał, że to będzie takie proste. Linq jest naprawdę niesamowity. Dzięki! – user1035217

Powiązane problemy