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:
分步实现思路
- 分离表头与数据:先把第一行的表头单独提取出来,剩下的行作为实际数据处理。
- 解析数据为可操作对象:将每一行按
|拆分,把grade字段转换为decimal类型(注意你的grade用逗号做小数分隔符,得指定对应的文化信息才能正确解析)。 - 执行多级排序:先按
domain升序排列,再按grade降序排列——LINQ的排序方法组合起来就能轻松实现这个逻辑。 - 重新拼接字符串:把排序后的数据转回竖线分隔的格式,再和表头合并。
- 写入文件:用
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
相关产品推荐
相关产品推荐

