Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get array index values of the top 1000 largest entries inside an array using LINQ

Tags:

c#

linq

I would like to have a nice clean LINQ code that can get an array of the index values of the top 1000 largest values inside an array.

For example:

int[] IndexArray = ArrayWithValues.Return_Indexes_Of_1000_Biggest_Values

The code is obviously bogus it is just to illustrate what I need.

UPDATE

I totally forgot to say that I need a second functionality. I have a second array, and I need to retrieve all the values in the second array which has the same indexes as contained inside the IndexArray.

I can do it easily using loops and all that but the code is big, and I want to learn to use LINQ more often but at the moment LINQ is still very foreign to me.

I have gone through similar questions asked here but I was not able to modify the code to suite my needs, since people usually only need the values and not the indexes of the values.

Thanks for the help!

like image 212
ceds Avatar asked Feb 16 '12 16:02

ceds


1 Answers

Something like this should work. It uses the overload of Select that allows you to incorporate a second input that is the index of the item in the sequence.

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

Simply project the value and index into an object, order by the value, take the top 1000 items, and then select simply the indexes before converting to an array.

Testing by taking the top 5 indexes from the array { 10, 4, 6, 8, 2, 3, 5, 1, 9, 7 } yields { 0, 8, 3, 9, 2 }, which maps to values { 10, 9, 8, 7, 6 }.


As the comments have already addressed in regards to your update, you can simply take these indices to select from the other if you are confident the arrays are equal in length or will otherwise not result in an IndexOutOfBoundsException.

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

Another method you could look up would be Enumerable.Zip.

like image 197
Anthony Pegram Avatar answered Oct 27 '22 13:10

Anthony Pegram