C#控制台读取txt筛选2004年入盟欧盟国家仅返回单条结果问题求解
问题原因
- 筛选条件不完整:当前代码仅判断日期的月份为05,没有限定年份为2004,逻辑本身存在疏漏
- 查询方法调用错误:
List<T>.Find()方法只会返回第一个符合条件的元素,因此你只能查询到第一个匹配的塞浦路斯,无法获取全部2004年5月入盟的国家 - 数据格式异常:EU.txt中克罗地亚的入盟日期写为
2013;07.01,错误使用分号分隔年份,会导致Country类构造时拆分字段报错,建议先修正该条数据为Croatia;2013.07.01
修正方案
替换原有统计、输出逻辑即可,优化后的完整代码如下,额外增加了异常兼容逻辑避免格式错误导致程序崩溃:
class Program { static List<Country> joining = new List<Country>(); static void read() { // 新增文件存在判断,避免运行时报错 if(!File.Exists("EU.txt")) { Console.WriteLine("EU.txt文件不存在"); return; } string[] rows=File.ReadAllLines("EU.txt"); foreach (var item in rows) { // 跳过空行避免拆分报错 if(string.IsNullOrWhiteSpace(item)) continue; joining.Add(new Country(item)); } } static void Main(string[] args) { read(); if(joining.Count == 0) { Console.ReadKey(); return; } // 筛选所有2004年5月入盟的国家 var join2004List = joining.Where(item => { var dateParts = item.date.Split('.'); // 兼容无效日期格式,避免索引越界 if(dateParts.Length < 3) return false; // 同时匹配年份2004、月份05两个条件 return dateParts[0] == "2004" && dateParts[1] == "05"; }).ToList(); // 输出统计数量 Console.WriteLine($"{join2004List.Count}个国家加入欧盟。"); // 拼接所有符合条件的国家名称输出 Console.WriteLine($"国家名称:{string.Join("、", join2004List.Select(c => c.name))}"); Console.ReadKey(); } } class Country { public string date, name; public Country(string row) { var parts = row.Split(';'); name = parts[0]; // 兼容字段拆分异常 date = parts.Length >=2 ? parts[1] : string.Empty; } }
运行结果
运行修正后的代码,会正确输出2004年入盟的全部10个国家:
10个国家加入欧盟。
国家名称:Cyprus、Czech、Estonia、Poland、Latvia、Lithuania、Hungary、Malta、Szlovakia、Szlovenia
内容的提问来源于stack exchange,提问作者Jackie Frei
相关产品推荐
相关产品推荐

