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

C#中按Domain升序、Grade降序排序文本文件内容的实现方法

解决你的C#文本文件排序问题

Hey there! No worries at all—let's get this sorted out for you. Using File.ReadAllLines is totally fine for your scenario, especially with small to medium-sized files; it's simple and straightforward. Here's a complete, LINQ-based solution that does exactly what you need:

分步实现思路

  1. 分离表头与数据:先把第一行的表头单独提取出来,剩下的行作为实际数据处理。
  2. 解析数据为可操作对象:将每一行按|拆分,把grade字段转换为decimal类型(注意你的grade用逗号做小数分隔符,得指定对应的文化信息才能正确解析)。
  3. 执行多级排序:先按domain升序排列,再按grade降序排列——LINQ的排序方法组合起来就能轻松实现这个逻辑。
  4. 重新拼接字符串:把排序后的数据转回竖线分隔的格式,再和表头合并。
  5. 写入文件:用File.WriteAllLines把结果输出(可以覆盖原文件,也可以指定新路径)。

完整代码示例

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

class StudentSorter
{
    static void Main()
    {
        string filePath = @"your-file-path-here.txt";
        string[] allLines = File.ReadAllLines(filePath);
        
        if (allLines.Length == 0)
        {
            Console.WriteLine("文件为空,无需处理");
            return;
        }

        // 提取表头行
        string header = allLines[0];
        
        // 处理数据行并排序
        var sortedData = allLines.Skip(1)
            .Select(line => 
            {
                string[] parts = line.Split('|');
                // 用fr-FR文化处理逗号分隔的小数,根据你的实际地区调整
                return new 
                {
                    Name = parts[0],
                    ID = parts[1],
                    Domain = parts[2],
                    Grade = decimal.Parse(parts[3], CultureInfo.GetCultureInfo("fr-FR")),
                    Verdict = parts[4]
                };
            })
            // 先按domain升序,再按grade降序
            .OrderBy(s => s.Domain)
            .ThenByDescending(s => s.Grade)
            // 拼接回竖线分隔的字符串
            .Select(s => $"{s.Name}|{s.ID}|{s.Domain}|{s.Grade.ToString("N2", CultureInfo.GetCultureInfo("fr-FR"))}|{s.Verdict}");

        // 合并表头和排序后的数据
        string[] outputLines = new[] { header }.Concat(sortedData).ToArray();
        
        // 写入文件(替换原文件或指定新路径)
        File.WriteAllLines(filePath, outputLines);
    }
}

重要细节说明

  • Grade字段的处理:因为你的grade用逗号作为小数分隔符,解析和格式化时必须指定对应的文化(比如fr-FR,或者其他使用逗号做小数分隔的地区文化),否则会抛出解析错误,或者输出时变成点分隔的小数。
  • 排序逻辑:OrderBy负责domain的升序排序,ThenByDescending在domain相同的情况下,按grade降序排列——这正是你需要的多级排序规则。
  • 文件读写的适用性:File.ReadAllLines和File.WriteAllLines是一次性读取/写入所有内容,适合文件不大的情况;如果是超大文件,建议改用StreamReader和StreamWriter逐行处理,但你的场景下当前方法完全够用。
  • 可选的异常防护:如果担心文件里有格式不规范的行(比如某一行拆分后不足5个部分),可以在Select里加个判断,比如if (parts.Length == 5)再解析,避免程序抛出异常。

运行这段代码后,就能得到你想要的排序结果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:37:39