C#二维数组转字符串时未正确添加换行符问题求助
问题分析与修复方案
先看你提供的测试代码:
public string myMethod(int[,] anArray) { string aString = ""; for (int i = 0; i < anArray.GetLength(0); i++) { for (int j = 0; j < anArray.GetLength(1); j++) { if (j == anArray.Length - 1) { aString += " " + anArray[i, j] + "\r\n"; continue; } aString += anArray[i, j] + "|"; } } return aString; }
你期望得到每行以换行结尾的格式化字符串:
0|0|0 0|0|0 0|0|0
但实际得到的却是所有元素用|连接的长字符串:
0|0|0|0|0|0|0|0|0|
正如你自己补充的,问题确实出在if条件的判断上——你用了anArray.Length来判断,但这个属性返回的是二维数组的总元素个数,而不是当前行的最后一列索引。
举个例子,如果是3x3的数组,anArray.Length是9,anArray.Length-1就是8,但内层循环的j最大只能到2(因为GetLength(1)是3,索引从0开始),所以这个if条件永远不会触发,所有元素都被加上了|,自然得不到预期的换行效果。
修复后的代码
把判断条件改成j == anArray.GetLength(1) - 1,GetLength(1)会返回数组的列数,减一就是当前行最后一列的索引:
public string myMethod(int[,] anArray) { string aString = ""; for (int i = 0; i < anArray.GetLength(0); i++) { for (int j = 0; j < anArray.GetLength(1); j++) { // 判断当前列是否是该行的最后一列 if (j == anArray.GetLength(1) - 1) { aString += anArray[i, j] + "\r\n"; continue; } aString += anArray[i, j] + "|"; } } return aString; }
额外优化建议
另外提一句,在循环里用string直接拼接字符串效率不高,尤其是当数组规模较大时,推荐使用StringBuilder来提升性能:
using System.Text; public string myMethod(int[,] anArray) { StringBuilder sb = new StringBuilder(); int rowCount = anArray.GetLength(0); int colCount = anArray.GetLength(1); for (int i = 0; i < rowCount; i++) { for (int j = 0; j < colCount; j++) { sb.Append(anArray[i, j]); if (j == colCount - 1) { sb.AppendLine(); // 等价于添加"\r\n",写法更简洁 } else { sb.Append('|'); } } } return sb.ToString(); }
内容的提问来源于stack exchange,提问作者user8605709
相关产品推荐
相关产品推荐

