如何将网格转换为2D数组

时间:2013-08-16 00:18:58

标签: c#

对于Euler问题11,我想将20x20网格转换为2D整数数组。

每行中的数字用空格分隔,行以返回值分隔。

  

例如:
  34 34 34 34
  34 34 34 34
  34 34 34 34
  34 34 34 34

我认为显示的网格是一个字符串,我想复制/粘贴,然后创建一个数组;但似乎不允许多行字符串。将网格保存为文件并将其读入数组会更容易吗? 我不是要求解决问题,我只是在寻找创建数组的帮助 我找到了如何使用.Split().Select().ToArray()

获取每一行并转换为一维数组
int[] rowOne = "34 34 34 34".Split(' ').Select(int.Parse).ToArray();  

我仍然是C#新手,我不确定将整个网格转换为2D数组的最简单方法。

2 个答案:

答案 0 :(得分:2)

允许使用多行字符串:

    var multilineString = @"
34 34 34
34 34 34";

在此之后,您可以按照您的建议进行操作:

string[] rows = multilineString.Split('\n');
int[] rowOne = rows[0].Split(' ').Select(int.Parse).ToArray();

获取2D数组:

string[] rows = multilineString.Split(
                  new[] {'\n'},
                  StringSplitOptions.RemoveEmptyEntries);

int[][] array = rows.Select(row => row
                                   .Split(' ')
                                   .Select(int.Parse)
                                   .ToArray())
                    .ToArray();

答案 1 :(得分:1)

假设您的网格存储在名为grid

的字符串中
string grid = @"34 34 34 34
            34 34 34 34
            34 34 34 34
            34 34 34 34";

var myArray = grid
    .Split('\n')
    .Select(t => t.Split(' ')
                    .Where((t1) =>
                    {
                        int i = 0;
                        return int.TryParse(t1, out i);
                    })
                    .Select(int.Parse).ToArray()
            ).ToArray();

这里的代码首先根据换行符然后是空格字符进行拆分。对“Where”的调用发送一个返回true或false的匿名方法,它尝试解析以查看该值是否为整数,因此只选择整数。

var是静态类型的,因此无论表达式返回什么,都将是myArray的类型。这实际上发生在编译时而不是运行时。我们可以很容易地说int [] [] myArray = ...

<强>测试

for (int i = 0; i < myArray.Length; i++)
{
    for (int j = 0; j < myArray[i].Length; j++)
    {
        Console.Write(myArray[i][j].ToString() + ' ');
    }
    Console.WriteLine();
}