C# 二维数组的一维上的String.join
我想用string.Join()打印一行二维数组,但找不到有效的方法。当然,我可以用一个简单的for循环来实现它,但是如果有一种方法来实现它,那将是一件有趣的事情 编辑我说的是普通多维数组: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循环更有效或可读,但您可以这样
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());