2012-02-16 13 views
5

配列内の上位1000個の最大値のインデックス値の配列を取得できるきれいなLINQコードが必要です。例えばLINQを使用して配列内の上位1000個の最大エントリの配列インデックス値を取得

int[] IndexArray = ArrayWithValues.Return_Indexes_Of_1000_Biggest_Values 

コードは明らかにそれはちょうど私が必要なものを説明することであるおかしなされます。

UPDATE

私は完全に私は2番目の機能が必要であることを言うのを忘れていました。私は2番目の配列を持っており、2番目の配列のIndexArray内に含まれるものと同じインデックスを持つすべての値を取得する必要があります。

私はループを使って簡単にやることができますが、コードは大きくなりますが、LINQをもっと頻繁に使用する方法を学びたいと思いますが、LINQは依然として非常に外国語です。

私はここで尋ねられた同様の質問をしましたが、人々は通常、値のインデックスではなく値のインデックスのみを必要とするため、コードをスイートに変更できませんでした。

ありがとうございました!

+0

更新のためには、実際には 'indexArray'を必要としない場合は、' var itemsFromSecondArray = indexArray.Select(i => secondArray [i]).ToArray() 'を呼び出すか、それ以外の場合はindexArray'を返します。 – Rup

答えて

7

何かこれはうまくいくはずです。 Selectのオーバーロードを使用して、シーケンスの項目のインデックスである2番目の入力を組み込むことができます。

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

単に、オブジェクト内の値とインデックスを投影値順、上位1000アイテムを取り、その後、アレイに変換する前に、単にインデックスを選択します。

{ 10, 4, 6, 8, 2, 3, 5, 1, 9, 7 }の上位5つのインデックスを使用してテストすると、値{ 10, 9, 8, 7, 6 }にマップされる{ 0, 8, 3, 9, 2 }が生成されます。


コメントがすでにアップデートに関しては対処してきたように、あなたは単にあなたが配列の長さが同じであるか、そうでない場合はIndexOutOfBoundsExceptionにはなりません確信している場合は、他の中から選択するには、これらの指標を取ることができます。

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

もう1つの方法は、Enumerable.Zipです。

+0

ありがとうございました、これはうまくいきましたが、後で別のものが必要であることを完全に忘れてしまいました。 – user1035217

+2

@ user1035217:最後の 'Select'を' Select(item => otherArray [item.index]) 'に変更するだけです。 –

+0

それは簡単だろうと思っていました。 Linqは本当に素晴らしいです。ありがとう! – user1035217

関連する問題