Вывести индексы топ 3 игроков по уровню используя LINQ

Я хочу из этого листа получить индексы топ 3 игроков с наибольшим уровнем, используя Linq. Если можно, то наиболее простой способ, я только начал изучать LINQ. Спасибо:)

class Program
    {
        static void Main(string[] args)
        {
            List<Player> players = new List<Player>()
            {
                new Player("Ян", 19),
                new Player("Владимир", 25),
                new Player("Дмитрий", 14),
                new Player("Леонид", 42),
                new Player("Виктория", 72), //index 4
                new Player("Елена", 55),
                new Player("Евгений", 55),
                new Player("Михаил", 45),
                new Player("Роман", 75), // index 8
                new Player("Николай", 85),  //index 9
                new Player("Александр", 15),
                new Player("Петр", 25),
            };
        }    
    }

    class Player
    {
        public string Name { get; private set; }
        public int Level { get; private set; }

        public Player(string name, int level)
        {
            Name = name;
            Level = level;
        }
    }

Ответ будет таков: индексы 9 8 4


Ответы (1 шт):

Автор решения: VladD

Самый простой метод, видимо, такой:

var bestIndices =
    players.Select((p, idx) => (p.Level, idx))    // преобразуем данные: нам нужны пары
                                                  // из уровня и индекса
           .OrderByDescending(pair => pair.Level) // сортируем по убыванию уровня
           .Select(pair => pair.idx)              // убираем уровень из данных,
                                                  // оставляем только индексы
           .Take(3);                              // берём 3 верхних

Но скорее всего вам не должны быть нужны индексы, а только сами элементы. В этом случае ваш код будет выглядеть так:

var best = players.OrderByDescending(p => p.Level).Take(3);
→ Ссылка