String.join在二维数组的一个维度上

时间:2017-02-15 17:50:47

标签: c# multidimensional-array

我想用string.Join()打印一行我的二维数组,但我找不到有效的方法。当然我可以通过一个简单的for循环来完成它,但知道是否有办法可以做到这一点很有意思。

编辑我正在谈论一个普通的多维数组:

int[,] multidimensionalArray= new int[,];

3 个答案:

答案 0 :(得分:3)

无法将行与正确的2D数组隔离开来。如果它是一个锯齿状阵列,那么解决方案就很明显了。

因此,如果使用数组的行对您来说是重要的操作,那么您可以考虑将其转换为锯齿状数组。

否则,如果此操作不是至关重要的话,那么循环是最不令人不安的方式。

您可以选择为此目的添加一个简单的扩展方法,并以这种方式将整个问题置于地毯下:

public static class ArrayExtensions
{
    public static IEnumerable<T> GetRow<T>(this T[,] array, int rowIndex)
    {
        int columnsCount = array.GetLength(1);
        for (int colIndex = 0; colIndex < columnsCount; colIndex++)
            yield return array[rowIndex, colIndex];
    }
}

这将为您提供仅处理一行的选项:

IEnumerable<int> row = array.GetRow(1);

例如,您可以在一行代码中从矩阵中打印一行:

Console.WriteLine(string.Join(", ", array.GetRow(1).ToArray()));

答案 1 :(得分:3)

Zoran Horvat的答案很好,如果我需要做的就是阅读数组,那就是我要做的事。

如果您还需要编写数组,可以执行以下操作:

struct ArrayRow<T> // Consider implementing IEnumerable<T>
{
  T[,] array;
  int row;
  public ArrayRow(T[,] array, int row) 
  { 
    this.array = array; 
    this.row = row;
  }
  public T this[int i]
  {
    get { return this.array[this.row, i]; }
    set { this.array[this.row, i] = value; }
  }
  public int Length 
  {
    get { return this.array.GetLength(1); }
  }
  public IEnumerable<T> Items ()
  {
    int c = this.Length;
    for (int i = 0; i < c; ++i)
      yield return this[i];
  }
}

static class Extensions 
{
  public static ArrayRow<T> GetRow<T>(this T[,] array, int row)
  {
    return new ArrayRow<T>(array, row);
  }
}

现在你有一些看起来像一维数组的东西,它实际上写入了你的二维数组:

var myRow = myArray.GetRow(10);
myRow[20] += 30;
string.Join(",", myRow.Items());

等等。

答案 2 :(得分:2)

不知道你认为这比for循环更有效还是可读,但你可以这样做:

string s = string.Join(separator,
                       Enumerable.Range(0, multidimentionalarray.GetLength(1))
                                 .Select(column => multidimentionalarray[row, column]));