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

C#开发中如何将Stopwatch计时值存入int数组实现排行榜

问题核心错误点
  • 类型赋值错误:你直接将Stopwatch类型的实例Time赋值给int[]数组的元素,两者类型完全不兼容。需要存储的是Time.ElapsedMilliseconds属性,这个属性才是毫秒级的计时数值(类型为long,可强转为int存储)。
  • 循环逻辑完全失效:两处for循环的条件写反,i > totalplayers在i初始值为0时永远不成立,循环体一次都不会执行;且循环内使用totalplayers作为数组下标而非循环变量i,即使循环能进入,也会反复覆盖同一个数组位置的数据。
  • 存值逻辑位置错误:成绩存储逻辑写在了答题正确的if判断块外,玩家答错、计时器未正常停止时也会写入无效数据。
  • 计数变量未更新:每次存入成绩后没有给统计总人数的totalplayers变量加1,后续新成绩会覆盖之前的存储内容。
  • 缺失重置逻辑:每次计时结束后没有重置Stopwatch实例,下一次玩家的计时会叠加历史时长,结果完全不准。
  • 平行数组维护疏漏:你计划输出年龄字段,但代码里没有对应年龄数组的存储逻辑,输出时会找不到对应数据。
可直接运行的修复代码

核心计时&成绩存储段

删掉原来多余的存值for循环,将存值逻辑移到答题正确的判断块内:

Console.WriteLine("Starting . . .");
randNum = rd.Next(65, 91);
letter = (char)randNum;
// 生成对应随机字母并存储
randum2 = rd.Next(1, 5000);

System.Threading.Thread.Sleep(randum2);
// 计时前先重置,避免历史数据干扰
Time.Reset();
Time.Start();
Console.WriteLine("\n\n");
Console.WriteLine(letter);
Console.WriteLine("\n");
letter1 = Console.ReadLine();

if (letter1 == letter.ToString())
{
    Time.Stop();
    int costMs = (int)Time.ElapsedMilliseconds;
    Console.WriteLine($"\nTime elapsed: {costMs} ms");
    Console.WriteLine($"Name: {name}");
    Console.WriteLine($"Age: {age}");
    Console.WriteLine($"House: {House}\n");

    // 判断数组剩余空间,避免越界报错
    if (totalplayers < timescore.Length)
    {
        namescore[totalplayers] = name;
        agescore[totalplayers] = age;
        Housescore[totalplayers] = House;
        timescore[totalplayers] = costMs;
        totalplayers++; // 总人数计数+1
    }
}

排行榜输出段

修正循环条件,补全年龄字段输出:

else if (choice == "Leaderboard")
{
    Console.WriteLine();
    // 修正循环条件:遍历所有已录入的玩家数据
    for(int i = 0; i < totalplayers; i++)
    {
        Console.WriteLine($"{namescore[i]}  年龄:{agescore[i]}  所属学院:{Housescore[i]}  用时:{timescore[i]}ms");
    }
}
更合理的排行榜实现方案

用多个平行数组存储关联数据非常容易出现下标不匹配、漏存字段的问题,推荐用面向对象的方式重构:

  1. 定义封装玩家成绩的实体类,所有关联字段聚合在一个对象中,不需要维护多个数组的对应关系:
public class PlayerResult
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string House { get; set; }
    public int CostMilliseconds { get; set; }
}
  1. 用List<PlayerResult>代替固定长度的数组,不需要提前预估玩家总数,不会出现数组越界问题,新增数据直接调用Add()方法即可,不需要手动维护计数下标。
  2. 输出排行榜前直接按用时升序排序,实现真正的排名逻辑(用时越短排名越高):
// 初始化存储列表,不需要提前指定长度
List<PlayerResult> leaderboard = new List<PlayerResult>();

// 玩家答对后存成绩的逻辑
leaderboard.Add(new PlayerResult
{
    Name = name,
    Age = age,
    House = House,
    CostMilliseconds = (int)Time.ElapsedMilliseconds
});

// 排行榜输出逻辑
else if (choice == "Leaderboard")
{
    Console.WriteLine("\n===== 反应测试排行榜 =====");
    // 按用时从短到长排序
    var sortedResult = leaderboard.OrderBy(res => res.CostMilliseconds).ToList();
    for (int i = 0; i < sortedResult.Count; i++)
    {
        var item = sortedResult[i];
        Console.WriteLine($"第{i+1}名:{item.Name} | 年龄:{item.Age} | 学院:{item.House} | 用时:{item.CostMilliseconds}ms");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.14 16:15:48