在C#控制台程序中,数组的输入不像动态语言那样可以直接把整行内容自动拆成列表,需要开发者手动完成字符串到数值类型的转换。C#的Console.ReadLine()方法返回的是一个完整字符串,当用户输入10 20 30时,程序并不会自动识别出这是三个整数。因此,掌握C#数组输入的几种方式,对后续编写算法题、数据处理工具或小型交互程序都很有帮助。本文将从快速拆分、逐项校验和封装复用三个角度展开,帮助读者在不同场景下选择最合适的输入方式。

使用Console.ReadLine与Split快速输入数组
最直接的数组输入思路是:先通过Console.ReadLine()读取整行文本,再借助string.Split方法按指定分隔符把字符串拆成多个片段,最后将每个片段转换成目标类型。例如用户输入10 20 30 40,中间以空格分隔,调用Split(' ')后会得到字符串数组["10","20","30","40"]。此时每个元素仍然是字符串,需要进一步转换。
如果确定输入格式非常规范,可以使用Array.ConvertAll配合int.Parse进行一次性转换。Array.ConvertAll接收两个参数,第一个是源数组,第二个是一个转换委托,常用写法为Array.ConvertAll(parts, int.Parse)。这种写法简洁高效,适合算法题中已经约定好输入格式的场景。但它的缺点是遇到空字符串或非法数字时会直接抛出异常,程序会中断,因此不适合交互式应用。
下面是一段完整的示例代码,演示如何读取一行空格分隔的整数并存入数组。代码中额外加入了StringSplitOptions.RemoveEmptyEntries,可以自动忽略连续空格产生的空项,提升容错性。
using System;
using System.Linq;
class Program
{
static void Main()
{
Console.WriteLine("请输入一组整数,用空格分隔:");
string input = Console.ReadLine();
string[] parts = input.Split(' ', StringSplitOptions.RemoveEmptyEntries);
int[] numbers = Array.ConvertAll(parts, int.Parse);
Console.WriteLine("数组内容:");
foreach (int n in numbers)
{
Console.Write(n + " ");
}
}
}
如果希望支持逗号、制表符等多种分隔符,可以把Split方法的参数改为字符数组,例如input.Split(new char[] { ' ', ',', '\t' }, StringSplitOptions.RemoveEmptyEntries)。这样用户可以输入10,20,30或10 20 30,程序都能正确解析。不过需要注意,字符串中包含反斜杠转义时,例如\t表示制表符,在C#源码中要写为'\t',反斜杠必须保留。
使用for循环和TryParse逐项读取
与一次性读取整行并拆分不同,另一种常见做法是先询问用户数组长度,再用for循环逐项读取每个元素。这种方式的好处是输入过程更可控,每读取一个值都可以立即进行校验,如果用户输入了非法内容,可以提示重新输入,不会因为一个错误导致整组数据作废。
在逐项输入场景下,推荐使用int.TryParse而不是int.Parse。int.TryParse会返回一个布尔值表示转换是否成功,并通过输出参数把转换结果传递出来。即使输入的是abc或空字符串,它也不会抛出异常,而是返回false,程序可以据此给出友好提示并让用户重新输入。下面的代码先校验数组长度必须是正整数,再逐个填充数组元素,直到所有位置都读取到有效整数为止。
using System;
class Program
{
static void Main()
{
Console.Write("请输入数组长度:");
int length;
while (!int.TryParse(Console.ReadLine(), out length) || length <= 0)
{
Console.Write("长度无效,请重新输入正整数:");
}
int[] arr = new int[length];
for (int i = 0; i < length; i++)
{
Console.Write($"请输入第 {i + 1} 个整数:");
while (!int.TryParse(Console.ReadLine(), out arr[i]))
{
Console.Write("输入格式错误,请重新输入整数:");
}
}
Console.WriteLine("数组元素为:");
for (int i = 0; i < length; i++)
{
Console.WriteLine($"arr[{i}] = {arr[i]}");
}
}
}
这种逐项读取的方式虽然在输入大量数据时显得繁琐,但非常适合需要严格校验、逐步引导用户的场景。例如在业务系统中录入固定数量的考试成绩、传感器采样值或配置参数时,逐项输入配合TryParse可以有效避免程序崩溃。它的缺点是交互次数较多,如果数组长度很大,用户体验会明显下降。因此在实际开发中,通常会结合需求选择更灵活的封装方案。
另外,如果需要读取的数组元素类型不是整数,而是double、decimal或其他数值类型,只需把int.TryParse替换为对应类型的TryParse方法即可,逻辑结构完全一致。这样可以复用同一种输入模式,减少重复学习成本。
封装通用输入方法与健壮性处理
当程序中需要多次输入数组,或者需要同时处理空输入、多余空格、非法字符等多种异常情况时,把读取逻辑封装成一个通用方法会更高效。通过封装,调用方只需要传入提示语和分隔符,方法内部负责循环读取、拆分、逐项校验,直到得到一个合法的整数数组才返回。
下面的代码定义了一个ArrayInputHelper类,其中包含ReadIntArray方法。该方法使用while循环持续等待合法输入,先检查整行内容是否为空,再用Split拆分,并逐项调用int.TryParse校验。如果某一项不是有效整数,会输出具体哪一项出错,然后要求用户重新输入整组数据。这样可以避免用户因为一个错误项而丢失前面已经输入的正确内容,交互上更加合理。
using System;
using System.Collections.Generic;
class ArrayInputHelper
{
public static int[] ReadIntArray(string prompt, char separator = ' ')
{
while (true)
{
Console.WriteLine(prompt);
string input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("输入不能为空,请重新输入。");
continue;
}
string[] parts = input.Split(new char[] { separator }, StringSplitOptions.RemoveEmptyEntries);
int[] result = new int[parts.Length];
bool valid = true;
for (int i = 0; i < parts.Length; i++)
{
if (!int.TryParse(parts[i], out result[i]))
{
Console.WriteLine($"第 {i + 1} 项不是有效整数:{parts[i]}");
valid = false;
break;
}
}
if (valid)
{
return result;
}
}
}
}
class Program
{
static void Main()
{
int[] numbers = ArrayInputHelper.ReadIntArray("请输入整数数组,使用空格分隔:");
Console.WriteLine("读取成功,数组长度为:" + numbers.Length);
}
}
从设计角度看,封装通用输入方法遵循了单一职责原则,把输入、校验、转换逻辑集中在一处,调用方只需关心拿到数组后如何计算。如果后续需要支持double数组或自定义分隔符,可以在此基础上扩展泛型方法,例如使用List<int>动态添加元素,避免事先确定长度。动态列表的写法如下:List<int> list = new List<int>();,然后在循环中调用list.Add(result[i]),最后通过list.ToArray()得到数组。这种方式在元素数量不确定时更加灵活。
对比三种方案,Split加Array.ConvertAll代码最短,适合格式严格、追求速度的算法题;for循环加TryParse最直观,适合逐个引导用户输入;封装通用方法则兼顾健壮性和复用性,适合需要处理复杂交互或频繁读取数组的项目。实际开发中,建议优先封装一个输入工具类,既能减少重复代码,也便于统一处理各种边界情况。
C#数组输入Console.ReadLine数组初始化修改时间:2026-08-28 13:56:55