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

C#跨窗体传用户名后,如何用StreamReader读取指定条目显示数组第5元素?

修正后的C#代码实现需求

我帮你梳理下原代码里的几个关键问题,然后给出能完美实现需求的修正版本:

原代码的核心问题

  • 你初始化的user列表是空的,所以user.Contains(username)这个判断永远不会成立,直接跳过了核心的文件读取和匹配逻辑
  • 逻辑顺序搞反了:应该先读取文件内容,再去匹配目标用户名,而不是先判断一个空列表
  • 没有正确处理文件流的资源释放,容易导致资源泄漏
  • 数组索引搞错了:C#里数组是从0开始计数的,你要的第5个元素对应的索引是4(不是5)
  • 没考虑到account.txt的格式是一行包含多个用户的信息,每个用户占6个字段,需要按组遍历查找

修正后的完整代码

private void Balance_Load(object sender, EventArgs e)
{
    // 获取登录窗体传递的用户名
    string targetUsername = login.accountname;
    
    // 使用using语句自动管理StreamReader资源,避免文件流泄漏
    using (StreamReader sr = new StreamReader("account.txt"))
    {
        // 读取文件全部内容(因为你的文件是单行格式)
        string fullContent = sr.ReadToEnd();
        // 分割所有字段,自动移除空字符串
        string[] allFields = fullContent.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
        
        // 按每个用户6个字段的规则遍历查找
        for (int i = 0; i < allFields.Length; i += 6)
        {
            // 匹配到目标用户名
            if (allFields[i].Equals(targetUsername, StringComparison.OrdinalIgnoreCase))
            {
                // 第5个元素对应索引i+4(从0开始计数:i是第1个字段,i+4是第5个)
                label3.Text = allFields[i + 4];
                // 找到后直接退出循环,无需继续遍历
                break;
            }
        }
    }
}

关键修正说明

  • 用using包裹StreamReader:确保文件流在使用完成后自动关闭,不需要手动调用Close(),避免资源泄漏
  • 适配单行文件格式:因为你的account.txt是一行包含所有用户数据,所以用ReadToEnd()一次性读取后再分割
  • 按用户字段组遍历:每个用户占6个字段,所以每次循环步长设为6,精准匹配每个用户的起始位置
  • 索引修正:第5个元素对应的数组索引是i+4(数组从0开始,第1个元素索引为i,第5个就是i+4)
  • 增加字符串匹配的容错性:用StringComparison.OrdinalIgnoreCase可以忽略大小写匹配(如果不需要可以去掉,改成直接==)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:39:01