首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#排序列表,同时还返回原始索引位置?

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

Stack Overflow用户
提问于 2009-11-19 08:44:25
回答 4查看 36.8K关注 0票数 35

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

为了更清楚起见,让我举个例子:

代码语言:javascript
复制
List<int> A = new List<int>(){3,2,1};
List<int> B;
List<int> idx;

Sort(A,out B,out idx);

之后:

代码语言:javascript
复制
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有没有什么内置机制可以让它更容易实现?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-19 08:48:16

使用Linq可以很容易地做到这一点。

  • 将您的列表转换为新的配对列表(对象,对象的原始索引)。
  • 按照列表对中的第一项对新列表进行排序
  • 提取排序后的列表和原始索引。

以下是演示该原理的一些代码:

代码语言:javascript
复制
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[idxi] = Bi,但希望这对你来说足够好了。

票数 60
EN

Stack Overflow用户

发布于 2009-11-19 11:53:12

虽然Mark Byer为您提供了一个使用LINQ的solution,但我想向您展示另一个使用.NET框架的解决方案。

有一个重载的Array.Sort可以帮你做到这一点:

代码语言:javascript
复制
int[] a = new[] { 3, 2, 1 };
int[] p = new[] { 0, 1, 2 };

Array.Sort(a, p);

Assert.IsTrue(a.SequenceEquals(new[] { 1, 2, 3 }));
Assert.IsTrue(p.SequenceEquals(new[] { 2, 1, 0 }));

因此,这里有一个满足您的规范的通用方法,它利用了这个重载:

代码语言:javascript
复制
void Sort<T>(
    List<T> input,
    out List<T> output,
    out List<int> permutation,
    IComparer<T> comparer
) {
    if(input == null) { throw new ArgumentNullException("input"); }
    if(input.Count == 0) {
        // give back empty lists
        output = new List<T>(); 
        permutation = new List<int>();
        return;
    }
    if(comparer == null) { throw new ArgumentNullException("comparer"); }
    int[] items = Enumerable.Range(0, input.Count).ToArray();
    T[] keys = input.ToArray();
    Array.Sort(keys, items, comparer);
    output = keys.ToList();
    permutation = items.ToList();   
}
票数 23
EN

Stack Overflow用户

发布于 2015-01-30 07:30:39

使用lambda的一种更优雅的方法

代码语言:javascript
复制
Array.Sort<int>(idx, (a, b) => A[a].CompareTo(A[b]));

这将从A数组中得到u idx数组

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1760185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档