【发布时间】:2010-12-29 08:35:08
【问题描述】:
我的目标是:给定条目列表和所需的顺序,根据此顺序重新排列条目列表。列表会很大,因此空间效率很重要。
例如:
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];
我可能弄错了,但似乎最直接且节省空间的解决方案是按 ordering 对 data 进行排序/排序.或更笼统地说:
给定两个列表: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?
【问题讨论】:
-
Reflector, profiler 是你的朋友。