C# 是否将具有随机唯一数字的数组转换为具有连续数字的数组?

C# 是否将具有随机唯一数字的数组转换为具有连续数字的数组?,c#,c,arrays,random,numbers,C#,C,Arrays,Random,Numbers,假设我有一个数组,它包含唯一的随机数(其中数字的可能范围很小,从0到20)。例如: [6, 3, 11, 9, 4, 5] 如何将以下数组转换为类似以下内容: [3, 0, 5, 4, 1, 2] 第二个数组从0开始,以(array.Length-1)结束,但位置与第一个数组中的幅值有关 如何在C/C++/C#中高效地实现这一点?(对该方法更感兴趣) 我只举了一个例子。它可以是任何东西: [7, 10, 0, 19, 50, 33, 45, 100] [1, 2, 0, 3, 6,

假设我有一个数组,它包含唯一的随机数(其中数字的可能范围很小,从0到20)。例如:

[6, 3, 11, 9, 4, 5]
如何将以下数组转换为类似以下内容:

[3, 0, 5, 4, 1, 2]
第二个数组从0开始,以(array.Length-1)结束,但位置与第一个数组中的幅值有关

如何在C/C++/C#中高效地实现这一点?(对该方法更感兴趣)

我只举了一个例子。它可以是任何东西:

[7, 10, 0, 19, 50, 33, 45, 100]
[1, 2,  0,  3,  6,  4,  5,   7]
数组A中的最小数字是数组B中的0。数组A中的最大数字是数组B中的(array.Length-1)。数组A可以是完全随机的(只是它永远不会包含两个或多个相同的数字),但数组A必须按照与数组A相同的顺序包含从0到array.Length-1的所有数字

int[] list1 = new[] { 7, 10, 0, 19, 50, 33, 45, 100 };
var orderedList = list1.OrderBy(x => x).ToList();
int[] list2 = list1.Select(x => orderedList.IndexOf(x)).ToArray();
编辑

根据@Blorgbeard的请求

int[] list1 = new[] { 6, 3, 11, 9, 4, 5 };

var dict = list1.OrderBy(x => x)
                .Select((i, inx) => new { i, inx })
                .ToDictionary(x => x.i, x => x.inx);

int[] list2 = list1.Select(x => dict[x]).ToArray();

转换是如何工作的?是不是
A1-3
<代码>A1/2?请先展示自己解决问题的一些尝试。
询问代码的问题必须表明对正在解决的问题的最低理解。包括尝试过的解决方案,为什么它们不起作用,以及预期的结果。
我只需要想法/方法来实现这一点。我试图在C语言中实现它,但是我确信如果它是C、C++或C语言,这不是关键的。如果对输入数字进行了排序,您希望输出数组成为输入数字的位置吗?我不理解针对这个问题的尖酸刻薄。OP要求一个算法,这个问题对我来说似乎很清楚。他表现出“对正在解决的问题的最低理解”。我想他可以添加一些尝试性的解决方案,但我看到了更糟糕的问题。非常好,+1。尽管这个问题很糟糕,但这个问题仍然很有趣,这是一个非常棒的解决方案。@tnw无意冒犯14V,但这是一个显而易见的解决方案,它看起来像O(n^2)-我想知道是否可以更有效地解决它。@Blorgbeard这个解决方案很好,因为它优雅且易于理解。它不是最有效的解决方案,但对于大多数UI用例来说应该足够快,而且很容易理解。我实际上是在想
array.Select((x,I)=>new{x,I}).OrderBy(p=>p.x).Select((p,j)=>new{p.I,j}).OrderBy(q=>q.I).Select(q=>q.j).ToArray()