根据另一个数组中给出的索引顺序重新定位数组中的项

本文关键字:数组 新定位 定位 索引 另一个 顺序 | 更新日期: 2023-09-27 17:49:28

我有如下两个数组:

string[] alb = new string[5] 
             {
                "B","Z","C", "E","T"
             };
int[] orderedIndexes = {0,3,4,1,2}

基于第二个数组中给出的索引,我想对齐第一个数组中的项。我不想使用另一个数组作为缓冲区,并且喜欢使用相同的数组来交换项。我期望的结果是

alb = {"B","E","T","Z","C"}. 

注意:因为真正的问题是有真正的商业价值,我不能张贴我做的作业。

根据另一个数组中给出的索引顺序重新定位数组中的项

linq的答案绝对很棒,但我认为用老派的数组操作方式解决它会很有趣。此外,问题的一部分提到没有创建缓冲区,这对我来说,linq的答案有点违反。不管怎样,为了它的价值…

using System;
namespace x
{
    class Program
    {
        static void Main()
        {
            var alb = new[] { "B","Z","C","E","T" };
            int[] orderedIndexes = {2,0,1,4,3};
            for (var i = 0; i < orderedIndexes.Length; i++)
            {
                var x = orderedIndexes[i];
                var ts = alb[i];
                alb[i] = alb[x];
                alb[x] = ts;
                x = Array.IndexOf(orderedIndexes, i);
                var ti = orderedIndexes[i];
                orderedIndexes[i] = orderedIndexes[x];
                orderedIndexes[x] = ti;
            }
            for (var i = 0; i < orderedIndexes.Length; i++)
            {
                Console.WriteLine("{0}, {1}", i, alb[i]);
            }
        }
    }
}

首先,您应该检查该索引数组是否为有效的索引数组,如下所示:

var isValidIndex = !Enumerable.Range(0, alb.Length - 1).Except(orderedIndexes).Any();

那么你可以简单地像这样在orderedIndexes上使用Select:

var result = orderedIndexes.Select(i => alb[i]).ToArray();
//result: {"B","E","T","Z","C"}