首页 > 解决方案 > 基于元素索引过滤数组的有效方法

问题描述

我有一个数组数组。所以我的第一个数组的每个元素都包含一个逗号分隔的值列表。如果我使用 split 函数,我可以从这个逗号分隔列表中获取一个数组。我需要做的是根据元素位置过滤掉第二个数组。例如,只保留第一、三、五和九列。

一种方法是遍历我的第一个数组,为每个元素对元素进行拆分以获取我的第二个数组。然后遍历第二个数组,增加一个计数器来跟踪当前元素的索引。如果计数器等于我要保留的列之一,则将该元素连接到字符串变量。

这是非常低效的,并且需要永远在大型阵列上运行。有没有人有更好的方法来做到这一点?我希望我清楚地解释了这一点。

标签: azure-logic-apps

解决方案


对于第一个循环,我不知道任何替代循环,但对于第二个循环,您可以简单地访问具有所需索引的元素,而不是遍历第二个数组。

假设大小不是问题。

string[] Arr1 = new string[] { "0_zero,0_One,0_Two,0_Three,0_Four,0_Five,0_six,0_seven,0_eight,0_nine",
                "1_zero,1_One,1_Two,1_Three,1_Four,1_Five,1_six,1_seven,1_eight,1_nine" };
            string myString = string.Empty;
            foreach(var a in Arr1)
            {
                var sp = a.Split(',');
                myString= string.Concat(myString, sp[0], sp[3], sp[5], sp[9]);                   
            }
            Console.WriteLine(myString); //gives "0_One0_Three0_Five0_nine1_One1_Three1_Five1_nine"

如果我们不确定每个字符串的长度,我们可以使用 if else 阶梯,从我们想要使用的最大索引开始按降序排列

foreach(var a in Arr1)
            {
                var sp = a.Split(',');
                int len = sp.Length;
                if (len >= 10)  myString= string.Concat(myString, sp[1], sp[3], sp[5], sp[9]);
                else if (len >= 6) myString = string.Concat(myString, sp[1], sp[3], sp[5]);
                else if (len >= 4) myString = string.Concat(myString, sp[1], sp[3]);
                else if (len >= 2) myString = string.Concat(myString, sp[1]);                        
            }

这样我们就不会遇到 IndexOutofBoundsException


推荐阅读