C#怎么输入一个数组?

来源:NET教程网作者:雪花头衔:草根站长
导读:本期聚焦于雪花创作的《C#怎么输入一个数组?》,敬请观看详情。控制台程序读取数组,本质上就是把一行字符串拆开,再逐个转成数值类型。最通用的做法是先用Console.ReadLine拿到整行输入,接着用Split按空格或逗号切割成字符串片段,最后通过int.Parse、Array.ConvertAll或LINQ的Select转成int数组。这里面的关键点有三个:一是分隔符要处理好,避免连续空格产生空字符串;二是类型转换要选对方法,Array.ConvertAll在代码简洁性和性能上通常优于手写循环;三是必须考虑用户可能输入非数字内容,用int.TryParse做容错比直接Parse更稳妥。如果数组长度已知,也可以先读长度,再循环读入每个元素。掌握这些方法后,就能根据实际场景选择一行输入、多行输入或动态长度输入,避免因为输入格式问题导致程序崩溃。

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

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

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/0922/60401.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。