C#中如何输入数组的值?三种常用方法详解

来源:DB2教程作者:台湾程序员头衔:程序员
导读:本期聚焦于台湾程序员创作的《C#中如何输入数组的值?三种常用方法详解》,敬请观看详情。从控制台读取一串数字并存入数组,是C#初学者常遇到的第一个关卡。Console.ReadLine方法返回的是字符串,如果直接赋值给整数数组会触发类型不匹配错误,而一些零散示例只展示Split用法,却没有说明空白项、格式错误和异常处理该如何配合。本文围绕C#数组输入这一基础操作,介绍三种实用方案:使用string.Split与Array.ConvertAll一次性转换、使用for循环配合int.TryParse逐项校验、以及封装通用输入方法减少重复代码。同时会说明空输入、多余空格、非法字符等常见问题的处理思路,并对比不同方案在易用性、健壮性和性能上的差异,帮助读者根据控制台程序、算法练习或工具开发等实际场景选择合适写法。

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

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.Parseint.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可以有效避免程序崩溃。它的缺点是交互次数较多,如果数组长度很大,用户体验会明显下降。因此在实际开发中,通常会结合需求选择更灵活的封装方案。

另外,如果需要读取的数组元素类型不是整数,而是doubledecimal或其他数值类型,只需把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()得到数组。这种方式在元素数量不确定时更加灵活。

对比三种方案,SplitArray.ConvertAll代码最短,适合格式严格、追求速度的算法题;for循环加TryParse最直观,适合逐个引导用户输入;封装通用方法则兼顾健壮性和复用性,适合需要处理复杂交互或频繁读取数组的项目。实际开发中,建议优先封装一个输入工具类,既能减少重复代码,也便于统一处理各种边界情况。

C#数组输入Console.ReadLine数组初始化修改时间:2026-08-28 13:56:55

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