我对排序集合感兴趣,但也返回一个索引,该索引可用于映射到集合中的原始位置(排序之前)。
让我举个例子更清楚:
List<int> A = new List<int>(){3,2,1};
List<int> B;
List<int> idx;
Sort(A,out B,out idx);
之后:
A = [3,2,1]
B = [1,2,3]
idx = [2,1,0]
这样A,B,idx的关系就是:
A[i] == B[idx[i] ]
,因为 i = 0...2
C#/.Net 是否有任何内置机制来使其易于实现?
谢谢。
最佳答案
使用 Linq 可以很容易地完成。
- 将您的列表转换为新的成对列表(对象,对象的原始索引)。
- 按对中的第一项对新列表进行排序
- 提取排序列表和原始索引。
下面是一些演示原理的代码:
List<int> A = new List<int>() { 3, 2, 1 };
var sorted = A
.Select((x, i) => new KeyValuePair<int, int>(x, i))
.OrderBy(x => x.Key)
.ToList();
List<int> B = sorted.Select(x => x.Key).ToList();
List<int> idx = sorted.Select(x => x.Value).ToList();
我认为这给出了 A[idx[i]] = B[i],但希望这对你来说足够好。
关于C# 排序列表同时还返回原始索引位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1760185/