我的目标是:给定一个条目列表和所需的顺序,根据该顺序重新排列条目列表。该列表将非常大,因此空间效率很重要。
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];
我可能错了,但这似乎是最直接和最直接的节省空间解决方案是排序/排序data by the ordering。或者更一般地说:
给定两个列表:A,B 有没有办法按 B 对 A 进行排序?该功能本质上与以下相同: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 的比较器?