Моя цель: учитывая список записей и желаемый порядок, переставить список записей в соответствии с этим порядком. Список будет очень большим, поэтому эффективность использования пространства важна.
Ex:
List<Entry> data = ReadDataFromSomeWhere(); // data => [a, b, c];
List<int> ordering = RandomPermutation(data.Count); // ordering => [2, 1, 3];
data.ReOrderBy(ordering); // data => [b, a, c];
Возможно, я ошибаюсь, но, похоже, самое простое и экономичное решение - это отсортировать / упорядочить данные по порядку . или, в более общем случае:
Учитывая два списка: A, B, есть ли способ отсортировать A по B? Функциональность будет по существу такой же, как:
Array.Sort<(Of <(TKey, TValue>)>)(array<TKey>[]()[], array<TValue>[]()[])
Одна методология, которая приходит на ум, - это создание нового типа данных, который состоит из A и B, т.е. Сопряжение, затем сортировка по значениям B:
List<T> A;
List<T> B;
Assert(A.Count == B.Count);
var C = A.Select( (a,idx) => new Pair<T,T>(B[idx],a)).OrderBy(c => c.First);
A = C.Select(x => x.Second).ToList();
Однако я хотел бы, чтобы это было как можно более эффективным с точки зрения пространства ( оба вызова select и tolist (), я полагаю, стоят дорого ), поэтому необходима в значительной степени сортировка на месте. Для этого есть ли способ написать компаратор для A.Sort (), который ссылается на B?