Правильный способ сделать это - соединить два списка по zip - объединение по zip - это объединение, которое объединяет две последовательности, как две половины молнии, отсюда и название.Предположим, у вас есть список очков и список игроков, такой что scores[i]
соответствует players[i]
для всех i
, и вы хотите упорядочить игроков по счету:
List<int> scores = whatever;
List<Player> players = whatever;
List<Player> sortedPlayers = players
.Zip(scores, (player, score) => new { player, score })
.OrderBy(pair => pair.score)
.Select(pair => pair.player)
.ToList();
каждый шаг.
- Zip-соединение создает последовательность пар (игрок, счет), используя анонимный тип.(В C # 7 вместо этого следует использовать кортеж: Упражнение : Сделайте так.)
- Сортируем список пар по счёту
- Извлекаем игроков из отсортированногопоследовательность пар
- Превращаем отсортированную последовательность игроков в список
и все готово.
Альтернативное решение: вышеприведенное решение работаетдля любой пары последовательностей , которые соответствуют.Если последовательности индексируемые , тогда мы можем использовать это альтернативное решение:
List<int> scores = whatever;
List<Player> players = whatever;
List<Player> sortedPlayers = players
.Select((player, index) => new { player, index })
.OrderBy(pair => scores[pair.index])
.Select(pair => pair.player)
.ToList();
Опять, следуйте:
- Мы начнем с последовательности игроков
- Мы производим последовательность пар (игрок, индекс), поэтому теперь мы знаем положение каждого игрока в его списке и, следовательно, в списке результатов.(Опять же: используйте кортеж в C # 7.)
- Мы сортируем пары, используя индекс, чтобы получить счет
- Мы извлекаем игроков из пар
- Мы поворачиваемсяэто в список.