C# 修改NamePeoples方法返回全量人员数据并筛选闰年出生人员
问题原因
你现有代码的NamePeoples方法在首次进入foreach循环时就直接执行了return,所以永远只返回第一条记录;同时返回值为单个元组,无法存储多条符合条件的结果。另外原有日期解析方法存在格式符错误,会导致带月/日的日期解析异常。
修改方案
- 首先在代码开头添加集合引用:
using System.Collections.Generic;
- 修复日期解析方法的格式符错误(原小写
mm是分钟单位,大写MM才是月份单位):
static DateTime ParseDate(string value) { DateTime date; if (!DateTime.TryParseExact(value, "yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) { if (!DateTime.TryParseExact(value, "yyyy-MM", CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) { if (!DateTime.TryParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) { throw new Exception("WRONG FORMAT"); } } } return date; }
- 重写
NamePeoples方法,改为返回多条符合条件的记录,增加闰年判断逻辑:
static List<(string Name, int BirthYear)> NamePeoples(string[][] people) { var result = new List<(string Name, int BirthYear)>(); foreach (var elements in people) { DateTime birthdayElement = ParseDate(elements[2]); var yearBirthday = birthdayElement.Year; // 筛选闰年出生的人员 if (DateTime.IsLeapYear(yearBirthday)) { result.Add((elements[1], yearBirthday)); } } return result; }
- 修改Main方法的输出逻辑,适配多结果返回:
static void Main(string[] args) { var timelineCSV = GetListOfStringsFromTextFile("../../../../timeline.csv"); var peopleCSV = GetListOfStringsFromTextFile("../../../../people.csv"); var timeline = ReadData(timelineCSV); var people = ReadData(peopleCSV); var leapYearPeoples = NamePeoples(people); if (leapYearPeoples.Count == 0) { Console.WriteLine("no"); } else { foreach (var item in leapYearPeoples) { Console.WriteLine($"姓名:{item.Name},出生年份:{item.BirthYear}"); } } }
原有CSV读取逻辑无需修改,
ReadData方法已经将所有4条记录完整存入people二维数组变量中。
内容的提问来源于stack exchange,提问作者Ilya Kvashnin
相关产品推荐
相关产品推荐

