将一系列数字转换为零基数顺序?

时间:2015-02-17 09:06:11

标签: c#

假设我有:

var correctOrder = new[] {2, 1, 0};
var actualPositionsFound = new[] {63,62,61];

如何轻松地将actualPositionsFound转换为基于零的序列?

所以,如果我有:

var actualPositionsFound = new[] {100,50,200];

我想最终:

var result = new[] {1,0,2};

更新:为了避免关闭更清楚,我认为要求的是将一个数字列表转换为另一个数字列表,代表另一个列表的升序像排序图一样,基于0。

因此{ 16, 19, 2, 4 }会创建一个基于0的地图{ 2, 3, 0, 1 }

3 个答案:

答案 0 :(得分:1)

如果没有重复:

var actualPositionsFound = new[] { 100, 50, 200 };
var indices = actualPositionsFound.OrderBy(n => n)
                                  .Select((n, i) => new { n, i })
                                  .ToDictionary(o => o.n, o => o.i);
var result = actualPositionsFound.Select(n => indices[n]).ToList();

答案 1 :(得分:0)

你在寻找吗?

actualPositionsFound.Select((elem, idx) => new { elem, idx })
                    .OrderBy(wrap => wrap.elem)
                    .Select((wrap, idx) => new { wrap.idx, newIdx = idx })
                    .OrderBy(wrap => wrap.idx)
                    .Select(wrap => wrap.newIdx)
                    .ToArray();

答案 2 :(得分:-1)

 actualPositionsFound
  .OrderBy(x => x).ToList()
  .Select(x => Array.IndexOf(actualPositionsFound,x)).ToArray();

这不会处理重复项。