在C#中迭代数组

本文关键字:数组 迭代 | 更新日期: 2023-09-27 17:51:15

考虑我有许多数组,如下所示:

string[,] op1 = new string[9, 9];
string[,] op2 = new string[9, 9];
string[,] op3 = new string[9, 9];

我该如何迭代如下这样的数组?

int i;
int j;
for(i=0; i<3; i++) {
    // Iterate all the above three arrays here
}

我只想通过更改索引来动态迭代以op开头的所有数组。

我正在使用C#。

在C#中迭代数组

您可以动态生成数组并迭代:

string[,] op1 = new string[9, 9];
string[,] op2 = new string[9, 9];
string[,] op3 = new string[9, 9];
foreach (var item in new[] { op1, op2, op3 })
{
     //...
}

您可以通过使用params关键字编写一个方法来变得聪明,该方法将自动为您创建一个数组数组。

要做到这一点,您必须为数组编写一个中间包装类,因为params关键字只能用于一维数组。

我真的只为好奇的人提供了这个代码——你可能真的不需要在真正的代码中达到这些长度。但是,如果确实发现自己经常想要迭代一组二维数组,则可以使用这种方法。

在编写了(可重复使用的(helper类之后,用于迭代数组的代码将如下所示:

string[,] op1 = new string[9, 9];
string[,] op2 = new string[9, 9];
string[,] op3 = new string[9, 9];
IterateArrays<string>(processArray, op1, op2, op3);

processArray()方法将沿着以下路线:

static void processArray(string[,] array, int index)
{
    Console.WriteLine("Processing array with index " + index);
}

以下是完整的可编译示例:

using System;
namespace ConsoleApp1
{
    public class ArrayWrapper<T>
    {
        public T[,] Array;
        public static implicit operator ArrayWrapper<T>(T[,] array)
        {
            return new ArrayWrapper<T> {Array = array};
        }
    }
    sealed class Program
    {
        void run()
        {
            string[,] op1 = new string[9, 9];
            string[,] op2 = new string[9, 9];
            string[,] op3 = new string[9, 9];
            IterateArrays<string>(processArray, op1, op2, op3);
        }
        static void processArray(string[,] array, int index)
        {
            Console.WriteLine("Processing array with index " + index);
        }
        public static void IterateArrays<T>(Action<T[,], int> action, params ArrayWrapper<T>[] arrays)
        {
            for (int i = 0; i < arrays.Length; ++i)
                action(arrays[i].Array, i);
        }
        static void Main(string[] args)
        {
            new Program().run();
        }
    }
}

就像我说的,这只是为了展示你如何处理它。它只是在真实代码中使用@thumbmunkeys建议。

您可以创建一个包含string[,]'slist<string[,]>

string[,] op1 = new string[9, 9];
string[,] op2 = new string[9, 9];
string[,] op3 = new string[9, 9];
//Create List, containing `string[,]`
List<string[,]> opList = new List<string[,]>();
//Add String[,]'s to list
opList.Add(op1);
opList.Add(op2);
opList.Add(op3);
//Loop over list
foreach(var itm in opList)
{
    //approach string[,]'s here
}
string[,] op1 = new string[9, 9];
string[,] op2 = new string[9, 9];
string[,] op3 = new string[9, 9];
List<string[,]> l = new List<string[,]>();
l.add(op1);
l.add(op2);
l.add(op3);
foreach(string[,] op in l)
{
 // iterate over op here
}

或者,如果您不希望额外的行将数组添加到列表中,您可以:

List<string[,]> ops = new List<string[,]>{
    new string[9, 9];
    new string[9, 9];
    new string[9, 9];
}
foreach(string[,] op in ops)
{
 // iterate over op here
}

你不能那样做。更简单的方法是将数组添加到List<T>中,并迭代列表来迭代数组:

List<string[,]> arrays = new List<string[,]>
{
    new string[9, 9],
    new string[9, 9],
    new string[9, 9]
};
foreach(var array in arrays)
{
    // Do something with the array...
}

使用:

for(int i=0;i<9;i++)
{
    for(int j=0;j<9;i++)
    {                             
        // Iterate your string op1,op2,op3 for the desired result.    
    }
}