从带有索引的数组中获取前 3 个最高值

Bar*_*ard 3 c# linq

我有一个包含双精度数的数组。现在我想从数组中获取 3 个最高值,并且我想知道它们的索引是什么。

这是我的代码:

var threeHighest = wineOfferCounter.OrderByDescending(x => x).Take(3).ToArray();
var firstIndex = wineOfferCounter.ToList().IndexOf(threeHighest[0]);
var secondIndex = wineOfferCounter.ToList().IndexOf(threeHighest[1]);
var thirdIndex = wineOfferCounter.ToList().IndexOf(threeHighest[2]);

Console.WriteLine("Offer " + firstIndex + " bought " + threeHighest[0] + " times");
Console.WriteLine("Offer " + secondIndex + " bought " + threeHighest[1] + " times");
Console.WriteLine("Offer " + thirdIndex + " bought " + threeHighest[2] + " times");
Run Code Online (Sandbox Code Playgroud)

但是当wineOfferCounter包含两个或多个相同的值时,我会得到第一个索引两次。相反,我想获得唯一的索引。因此,如果在位置处的wineOfferCounter[3]值是 25,并且在wineOfferCounter[6]处的值也是 25。结果是:

"Offer 3 bought 25 times"
"Offer 3 bought 25 times"
Run Code Online (Sandbox Code Playgroud)

但我想要:

"Offer 3 bought 25 times"
"Offer 6 bought 25 times"
Run Code Online (Sandbox Code Playgroud)

Ale*_*eev 5

您可以创建一个带有索引和值的临时类,然后按此类成员进行排序。像这样的代码:

var result = wineOfferCounter
    .Select((v, i) => new { v, i })
    .OrderByDescending(x => x.v)
    .ThenByDescending(x => x.i)
    .Take(3)
    .ToArray();
Run Code Online (Sandbox Code Playgroud)

然后迭代这个集合:

foreach (var entry in result)
{
    Console.WriteLine("Offer " + entry.i + " bought " + entry.v + " times");
}
Run Code Online (Sandbox Code Playgroud)