C# 二维数组的一维上的String.join

C# 二维数组的一维上的String.join,c#,multidimensional-array,C#,Multidimensional Array,我想用string.Join()打印一行二维数组,但找不到有效的方法。当然,我可以用一个简单的for循环来实现它,但是如果有一种方法来实现它,那将是一件有趣的事情 编辑我说的是普通多维数组: int[,] multidimensionalArray= new int[,]; var myRow = myArray.GetRow(10); myRow[20] += 30; string.Join(",", myRow.Items()); 不知道您是否认为这比for循环更有效或可读,但您可以这样

我想用string.Join()打印一行二维数组,但找不到有效的方法。当然,我可以用一个简单的for循环来实现它,但是如果有一种方法来实现它,那将是一件有趣的事情

编辑我说的是普通多维数组:

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

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

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

无法将行与正确的二维数组隔离。如果它是一个锯齿状阵列,那么解决方案是显而易见的

因此,如果使用数组的行对您是重要的操作,那么您可能会考虑将其转换成锯齿数组。

否则,如果此操作不具有根本重要性,则循环是最不干扰的方式

为此,您可以选择添加一个简单的扩展方法,并以这种方式将整个问题隐藏起来:

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];
    }
}

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);
  }
}

等等。

你是如何声明你的数组-
int[,]
int[][]
?@dana修复了它。如果这是唯一的方法,我会坚持for循环:在这种情况下,维度0不给你行而不是列吗?@Shimmy你是什么意思?它包括在内。我不明白,
变量从哪里来?我所做的是我使用了
选择
的重载,它接受一个
Func
,中间的
int
表示当前的迭代索引。非常有趣,这可能非常方便。谢谢。:D
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());