You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#将随机排序的用户输入姓名数组写入文件时数据保存异常求助

问题成因
  • 随机排序、写入文件的逻辑错误嵌套在输入姓名的for循环内:每输入1个姓名就打乱一次整个数组,此时数组中还未完成输入的位置均为null值,且每次写入都会直接覆盖整个文件,最终写入的内容会包含大量空值、顺序也完全不符合预期。
  • 调用了异步方法File.WriteAllLinesAsync但没有添加await等待执行完成:主线程会继续向下执行,IO操作可能还没完成就被中断,导致文件内容写入不完整甚至完全为空。
  • 读文件逻辑在程序启动时就执行:如果用户先执行写入操作再执行读取操作,读取的仍然是程序启动时加载的旧文件内容,无法拿到最新写入的结果。
修复方案

调整逻辑顺序:先完成所有姓名输入,再做随机排序,最后一次性写入文件;读取文件操作移到read分支触发时再执行,优先使用同步写入方法避免异步等待问题,修复后代码如下:

using System;
using System.Linq;
using System.IO;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            Random rnd = new Random();
            // 统一文件路径避免两处写路径不一致
            string filePath = @"C:\Users\dvfsn\Desktop\Coding\cSharp testing\studentnames.txt";

            Console.WriteLine("你想要读取还是写入数据?");
            switch(Console.ReadLine()){
                case "write":
                    string[] names = new string[10];
                    // 先完成所有姓名输入
                    for (int i = 0; i < names.Length; i++)
                    {
                        Console.WriteLine("输入第{0}个姓名", i);
                        names[i] = Console.ReadLine();
                    }
                    // 全部输入完成后再做随机排序
                    names = names.OrderBy(x => rnd.Next()).ToArray();
                    // 用同步方法一次性写入文件,避免异步未完成问题
                    File.WriteAllLines(filePath, names);
                    Console.WriteLine("写入完成");
                break;

                case "read":
                    Console.WriteLine("你想要读取什么数据?");
                    switch(Console.ReadLine()){
                        case "names":
                            // 触发读取时再加载最新的文件内容
                            string[] lines = File.ReadAllLines(filePath);
                            Console.WriteLine("内容如下:");
                            foreach (string line in lines){
                                Console.WriteLine("\t" + line);
                            }
                        break;
                    }
                break;
            }
            Console.ReadLine();
        }
    }
}
补充说明
  • 如果需要保留异步写入逻辑,需要将Main方法改为异步签名static async Task Main(string[] args),写入时添加await关键字:await File.WriteAllLinesAsync(filePath, names)即可正常执行。
  • 如果不需要固定输入10个姓名,可以改用List<string>动态存储输入内容,避免未填充满数组产生的空值问题。

内容的提问来源于stack exchange,提问作者dvfsn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:09:02