Самый простой способ представить это с помощью правого внутреннего соединения:
return order.Join(unsortedList, a => a, b => b, (a, b) => b).ToList();
Наилучшая временная сложность - O (n + m) с использованием поиска или словаря:
var lookup = unsortedList.ToLookup(x => x);
return order.SelectMany(x => lookup[x]).ToList();
Вышеприведенное может быть в несколько раз быстрее, если использовать Dictionary<string, int>
для получения количества элементов в unsortedList
, а затем выполнить цикл по order
для получения результата на основе соответствующих значений в словаре счетчиков.
Lookup
и Dictionary
используют хеш-таблицу для хранения значений. Чтобы найти элемент в хеш-таблице, значение хеша вычисляется из значения, которое аналогично предполагаемому местоположению / индексу, где значение находится в хеш-таблице. Это позволяет только 1 или несколько сравнений, необходимых для нахождения (или нет) значения в хеш-таблице. Итак, O (n) для генерации Lookup или Dictionary из unsortedList
, и поскольку хеш-таблица имеет среднее время O (1) поиска, только O (m) время, необходимое для генерации результата с использованием Lookup или Dictionary, в результате чего получается общее O (n + m) временная сложность.