打印出2D数组[,]

时间:2018-04-20 08:30:19

标签: c# arrays string concatenation

我有一个二维数组array),并尝试打印出(Console.WriteLine)由分号;分隔的元素。即有像

这样的数组
MyType[,] array = new MyType[,] 
{
    {item11, item12, item13},
    {item21, item22, item23},
};

我正在寻找结果

item11;item12;item13
item21;item22;item23 

我的尝试是:

for (int y = 0; y < (array.GetLength(0)); y++)
{
    for (int x = 0; x <= 8; x++)
    {
        //--> This way it works however I get the final ; 
        // after the last element which I do not need
        Console.Write(array[y, x] + ";"); 
        //--> This way I get only semicolons and no array elements
        Console.Write(String.Join(";", array)); 
    }
    Console.WriteLine('\r');
}

如何解决?

2 个答案:

答案 0 :(得分:1)

尝试按项目打印项目(实际上,您不要连接这些项目,而是将它们输出到控制台):

for (int y = 0; y < array.GetLength(0); ++y) {
  if (y > 0)
    Console.WriteLine();

  for (int x = 0; x < array.GetLength(1); ++x) {
    if (x > 0) 
      Console.Write(";");   

    Console.Write(array[y, x]); 
  }
}

对于

int[,] array = new int[,] {
  { 1, 2, 3},
  { 4, 5, 6},
};

上面的代码打印出来

1;2;3
4;5;6

如果您想string(稍后可以打印),请将Console更改为StringBuilder

StringBuilder sb = new StringBuilder();

for (int y = 0; y < array.GetLength(0); ++y) {
  if (y > 0)
    sb.AppendLine();

  for (int x = 0; x < array.GetLength(1); ++x) {
    if (x > 0) 
      sb.Append(";");   

    sb.Append(array[y, x]); 
  }
}

string result = sb.ToString();

...

Console.Write(result);

旁注:请注意使用锯齿状数组([][]而不是[,])更容易:只有两个Join s :

Console.Write(string.Join(Environment.NewLine, array
  .Select(line => string.Join(";", line))));

答案 1 :(得分:0)

如果您使用的是MoreLinq扩展程序,则可以使用a Batch operator来简化此操作。这是available on NuGet

使用Batch运算符,解决方案如下所示:

using System;
using System.Linq;
using MoreLinq;

namespace Demo
{
    class Program
    {
        static void Main()
        {
            int[,] array =
            {
                { 0, 1,  2,  3 },
                { 4, 5,  6,  7 },
                { 8, 9, 10, 11 }
            };

            foreach (var row in array.Cast<int>().Batch(array.GetLength(1)))
            {
                Console.WriteLine(string.Join(";", row));
            }
        }
    }
}

如果你想得到想象,你可以编写一个扩展方法来迭代二维数组的行(使用Batch()):

public static class TwoDimensionalArrayExt
{
    public static IEnumerable<IEnumerable<T>> Rows<T>(this T[,] array)
    {
        return array.Cast<T>().Batch(array.GetLength(1));
    }
}

代码变得更具可读性:

foreach (var row in array.Rows())
{
    Console.WriteLine(string.Join(";", row));
}