在C#中迭代数组

时间:2014-03-21 08:53:47

标签: c# arrays

考虑我有以下几个数组:

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#。

6 个答案:

答案 0 :(得分:9)

你可以动态制作一个数组并迭代:

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 })
{
     //...
}

答案 1 :(得分:2)

您可以通过使用params关键字编写方法来获得智能,该关键字将自动为您创建数组数组。

为此,您必须为数组编写中间包装类,因为params关键字只能与单维数组一起使用。

我真的只为好奇者提供这段代码 - 你可能真的不需要在实际代码中使用这些代码。但是,如果您 发现自己经常想要迭代一组二维数组,则可以使用此方法。

在编写(可重用)辅助类之后,迭代数组的代码将如下所示:

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建议。

答案 2 :(得分:1)

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
}

答案 3 :(得分:1)

您可以创建包含list<string[,]>

string[,]'s
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
}

答案 4 :(得分:1)

你不能这样做。更容易将数组添加到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...
}

答案 5 :(得分:-3)

使用:

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