使用LINQ获取数组中前1000个最大条目的数组索引值

ced*_*eds 5 c# linq

我想有一个很好的干净的LINQ代码,可以获得数组中前1000个最大值的索引值数组.

例如:

int[] IndexArray = ArrayWithValues.Return_Indexes_Of_1000_Biggest_Values
Run Code Online (Sandbox Code Playgroud)

代码显然是假的,它只是为了说明我需要的东西.

UPDATE

我完全忘了说我需要第二个功能.我有第二个数组,我需要检索第二个数组中的所有值,这些值与IndexArray中包含的索引相同.

我可以轻松地使用循环和所有这些,但代码很大,我想学习更频繁地使用LINQ,但目前LINQ对我来说仍然非常陌生.

我在这里遇到了类似的问题,但我无法修改代码来满足我的需求,因为人们通常只需要值而不是值的索引.

谢谢您的帮助!

Ant*_*ram 8

这样的事情应该有效.它使用了重载Select,允许您合并第二个输入,该输入是序列中项目的索引.

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

只需将值和索引投影到一个对象中,按值排序,取前1000项,然后在转换为数组之前简单地选择索引.

通过从阵列服用前5索引测试{ 10, 4, 6, 8, 2, 3, 5, 1, 9, 7 }产量{ 0, 8, 3, 9, 2 },其映射到值{ 10, 9, 8, 7, 6 }.


由于注释已经针对您的更新进行了解决,因此如果您确信数组的长度相等或者不会导致数组,则可以简单地从这些注释中选择这些索引IndexOutOfBoundsException.

.Select(item => otherArray[item.index])
.ToArray();
Run Code Online (Sandbox Code Playgroud)

你可以查找的另一种方法是Enumerable.Zip.

  • @ user1035217:只需将最后一个`Select`更改为`Select(item => otherArray [item.index])`. (2认同)