C# 排序列表同时还返回原始索引位置?

标签 c# .net sorting collections

我对排序集合感兴趣,但也返回一个索引,该索引可用于映射到集合中的原始位置(排序之前)。

让我举个例子更清楚:

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/

相关文章:

.net - 元组和值元组

python - 按字母顺序对字典排序

.net - 在 DataGridView 中排序时等待光标

c# - 多列数据转换

c# - 如何刷新屏幕以使关闭的表单真正消失

c# - 在 C# 中查看一个字符串是否包含另一个字符串的最快、不区分大小写的方法是什么?

c# - PrintNormal() 问题 'It is not Initialized'

c# - 为什么我只有一部分 asp.net 成员表?

javascript - 数据嵌套时 AngularJs 表排序

c# - 从 ImageFormat.MemoryBMP 确定文件类型