假设我有:
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 }
。
答案 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();
这不会处理重复项。