Использование List.OrderBy для сортировки списка по позициям, хранящимся в другом списке - PullRequest
0 голосов
/ 11 июня 2018

У меня есть два списка, один с позиционными переменными (и другими вещами, но это важная часть для этого) и один с элементами, которые мне нужно отсортировать.Можно ли отсортировать мой второй список по позиционным переменным в первом, используя OrderBy?

Я мог бы просто отсортировать это нормально, но мне любопытно, как работает OrderBy, поэтому я хотел бы попробовать это.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Правильный способ сделать это - соединить два списка по 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.)
  • Мы сортируем пары, используя индекс, чтобы получить счет
  • Мы извлекаем игроков из пар
  • Мы поворачиваемсяэто в список.
0 голосов
/ 11 июня 2018

Если я вас правильно понимаю, вы можете сделать следующее:

IEnumerator<int> position = listWithPositions.GetEnumerator();
var sortedList = listToSort.OrderBy(p => 
    {
        position.MoveNext();
        return position.Current;
    }
).ToList<Object>();

Редактировать: Мне нужно добавить, что это нехорошая практика, вы можете подумать об организации вашегоданные в SortedDictionary вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...