C#重写ToString()按指定格式打印二维矩阵的问题求解
问题原因
两个核心错误导致实现失败:
- 循环边界错误:C# 数组索引起始值为0,
this.matrix共this.rows行、this.columns列,合法行索引范围是0 ~ this.rows - 1,合法列索引范围是0 ~ this.columns -1。原来写的r <= this.rows、c <= this.columns会访问数组不存在的索引位置,要么触发索引越界,要么取到未赋值的空值,引发NullReferenceException。 - 循环逻辑划分错误:外层循环应该处理行级逻辑(行首的
[、行尾的]\n),内层循环只负责拼接当前行的列值和列之间的空格,之前没有拆分两层循环的职责,很容易出现拼接顺序错乱。
可直接运行的实现
建议用StringBuilder做字符串拼接,性能远高于反复拼接string对象,代码如下:
using System.Text; // 记得引入这个命名空间 public override string ToString() { // 防御性校验,避免字段未初始化时报错 if (this.matrix == null || this.rows <= 0 || this.columns <= 0) { return string.Empty; } StringBuilder matrixView = new StringBuilder(); // 遍历每一行,边界用 < 而非 <= for (int r = 0; r < this.rows; r++) { matrixView.Append('['); // 遍历当前行的所有列 for (int c = 0; c < this.columns; c++) { // 处理单元格值为null的情况,默认输出0,避免空引用异常 matrixView.Append(this.matrix[r, c]?.ToString() ?? "0"); // 非最后一列时,值后面补空格 if (c != this.columns - 1) { matrixView.Append(' '); } } // 行尾加]和换行 matrixView.Append("]\n"); } return matrixView.ToString(); }
逻辑说明
- 每行固定以
[开头,遍历完当前行所有列后加]和换行,严格执行this.rows次,符合行数要求 - 每行内输出
this.columns个值,仅在非最后一个值后面加空格,刚好凑够this.columns - 1个分隔空格,完全匹配要求的输出格式 - 空值校验逻辑覆盖了
matrix未初始化、单元格值为null两种会触发空引用的场景
内容的提问来源于stack exchange,提问作者user17682078
相关产品推荐
相关产品推荐

