在C#控制台程序中,数组输入通常不是一步完成的。标准输入流每次读入的是一个字符串,需要先把它拆分成多个片段,再逐个转换成目标类型。下面会从最简单的空格分隔整数讲起,再扩展到逗号分隔、异常容错以及多行输入。

一、用 Console.ReadLine 和 Split 完成基础输入
控制台读取一整行数据最直接的方法是 Console.ReadLine。假设用户输入 10 20 30 40,该方法返回的字符串就是 "10 20 30 40"。这个字符串还无法直接当数组使用,需要调用 Split 方法按空格切割,得到一个 string[]。接着遍历这个字符串数组,把每个元素用 int.Parse 转成整数并存入 int[]。
最基础的写法如下:
string line = Console.ReadLine();
string[] parts = line.Split(' ');
int[] numbers = new int[parts.Length];
for (int i = 0; i < parts.Length; i++)
{
numbers[i] = int.Parse(parts[i]);
}
Console.WriteLine(string.Join(", ", numbers));这段代码虽然清晰,但 Split(' ') 有一个明显问题:如果用户输入时多敲了空格,比如 10 20,Split 会返回空字符串片段,int.Parse 遇到空字符串会抛出 FormatException。另外,如果希望同时支持空格和逗号作为分隔符,单字符重载也不够用。更稳妥的做法是传入字符数组,并指定 StringSplitOptions.RemoveEmptyEntries,让 Split 自动丢弃空片段。
改进后的代码可以这样写:
string line = Console.ReadLine();
string[] parts = line.Split(
new char[] { ' ', ',' },
StringSplitOptions.RemoveEmptyEntries);
int[] numbers = new int[parts.Length];
for (int i = 0; i < parts.Length; i++)
{
numbers[i] = int.Parse(parts[i]);
}
Console.WriteLine(string.Join(", ", numbers));在这个版本里,无论用户用空格、逗号,还是混合使用,都能得到正确的字符串数组。分割后的结果不再包含空字符串,后续转换会更加安全。这也是控制台输入数组时最常用的基础模板。
二、用 Array.ConvertAll 或 LINQ 简化转换
手写 for 循环完成字符串到整数的转换虽然直观,但每次都要声明索引、逐个赋值,代码会显得啰嗦。.NET 提供了 Array.ConvertAll 静态方法,它接受一个数组和一个转换委托,内部完成循环转换,并返回新的目标数组。对于 string[] 转 int[],可以直接使用方法组 int.Parse。
string line = Console.ReadLine();
string[] parts = line.Split(
new char[] { ' ', ',' },
StringSplitOptions.RemoveEmptyEntries);
int[] numbers = Array.ConvertAll(parts, int.Parse);
Console.WriteLine(string.Join(", ", numbers));这种写法比手写循环短很多,而且意图非常明确:把 parts 中的每个字符串解析成整数。它的性能与手写循环基本相当,因为内部就是一次遍历,不需要额外创建集合。
如果代码中已经引用了 System.Linq 命名空间,还可以用更函数式的方式:先 Split,再 Select(int.Parse),最后 ToArray()。示例如下:
using System;
using System.Linq;
string line = Console.ReadLine();
int[] numbers = line
.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(int.Parse)
.ToArray();
Console.WriteLine(string.Join(", ", numbers));LINQ 版本的好处是可读性强,后续如果还要过滤、排序,可以直接在链式调用中继续添加操作。比如只保留大于 10 的数字,可以在 Select 之后加 Where。不过要注意,LINQ 的链式调用会引入一定的委托开销,对于控制台程序里用户手动输入的数据量来说,这个开销几乎可以忽略不计。
实际选择时,如果只需要简单转换,Array.ConvertAll 足够;如果后续还要做筛选、排序、聚合等操作,直接上 LINQ 会更加顺手。
三、处理输入异常与边界情况
控制台输入最大的不确定性来自用户。空行、非数字字符、小数、超出 int 范围的大整数,都可能导致 int.Parse 抛出异常。直接使用 Parse 的代码在遇到这些输入时会直接崩溃,这在交互式程序里体验很差。更合理的做法是使用 int.TryParse,它返回布尔值表示是否转换成功,不会抛异常。
如果希望过滤掉非法片段,只保留有效整数,可以用 List<int> 动态收集结果,最后再转成数组:
using System;
using System.Collections.Generic;
string line = Console.ReadLine();
string[] parts = line.Split(
new char[] { ' ', ',' },
StringSplitOptions.RemoveEmptyEntries);
List<int> list = new List<int>();
foreach (string p in parts)
{
if (int.TryParse(p, out int n))
{
list.Add(n);
}
}
int[] numbers = list.ToArray();
Console.WriteLine($"有效数字个数:{numbers.Length}");这段代码不会因为个别非法片段而中断。用户输入 1 abc 3 时,程序会跳过 abc,最终得到包含 1 和 3 的数组。但过滤策略也有缺点:用户可能并不知道某些输入被忽略了。如果对数据准确性要求较高,应该在转换失败时给出提示,并要求重新输入。
另一种策略是循环提示直到输入合法。可以写一个循环,每次读取一行,尝试转换所有片段,只有全部成功才跳出循环。这种方式更适合严格要求整数数组的场景,比如后续要做排序或统计。
四、多行输入与动态长度输入
前面讨论的都是一行输入多个元素。如果题目或程序要求每个元素单独占一行,流程会稍有不同。常见做法是先读入一个整数表示数组长度,再循环读取后续元素。例如用户先输入 5,表示后面有 5 个整数,每个整数单独一行。
Console.Write("请输入数组长度:");
int length = int.Parse(Console.ReadLine());
int[] numbers = new int[length];
for (int i = 0; i < length; i++)
{
Console.Write($"请输入第 {i + 1} 个元素:");
numbers[i] = int.Parse(Console.ReadLine());
}
Console.WriteLine(string.Join(", ", numbers));这种输入方式的好处是数组长度一开始就确定,可以预先分配固定大小的 int[],不需要中间集合。缺点是多行输入对用户来说操作更繁琐,适合题目有明确行数要求的场景。
如果数组长度事先不确定,可以读取到空行或文件结束符为止。此时使用 List<int> 动态添加元素比数组更合适,因为数组长度不可变,手动扩容需要复制数据。结束时调用 ToArray 即可得到数组。
using System;
using System.Collections.Generic;
List<int> list = new List<int>();
string line;
while (!string.IsNullOrEmpty(line = Console.ReadLine()))
{
if (int.TryParse(line, out int n))
{
list.Add(n);
}
}
int[] numbers = list.ToArray();
Console.WriteLine($"共输入 {numbers.Length} 个整数");这里的循环条件会在读到空行时退出。如果是在重定向文件输入的场景下,Console.ReadLine 读到文件末尾会返回 null,string.IsNullOrEmpty 同样能处理,因此程序可以正常结束。
总的来说,C# 中输入数组并没有唯一标准答案,核心是理解从字符串到目标数组的转换链路。一行输入用 Split 加 Array.ConvertAll 或 LINQ;对输入质量不放心就用 TryParse 做容错;如果行数固定,可以先读长度再逐个读取;如果长度不确定,就借助 List<int> 动态收集。把这些基础模板组合起来,基本能覆盖控制台程序中绝大多数数组输入需求。
C#数组输入Console.ReadLineSplit修改时间:2026-09-22 07:52:34