我想用string.Join()打印一行我的二维数组,但我找不到有效的方法。当然我可以通过一个简单的for循环来完成它,但知道是否有办法可以做到这一点很有意思。
编辑我正在谈论一个普通的多维数组:
int[,] multidimensionalArray= new int[,];
答案 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]));