如何验证日期列表中每年所有月份完整性及处理重复数据
问题与解决方案
已知代码
给定的C#实体类:
public class DateGenerator { public DateOnly GeneratedDate {get; set;} }
待处理的数据列表:
List<DateGenerator> dateGenerators;
需求说明
- 验证列表中每一年是否包含1-12月的全部月份
- 识别同一年的重复数据组(比如同一年存在多组独立的日期集合),并检查每组是否都覆盖全年12个月份
- 示例场景:2009年缺前6个月 → 验证不通过;2011年有两组数据,其中第二组不全 → 验证不通过
实现方案
以下是VerifyCompleteMonthlySet方法的具体实现,通过分组统计来处理重复数据组的检查:
public bool VerifyCompleteMonthlySet(List<DateGenerator> dateGenerators) { // 空列表直接返回false(若业务认为空列表合法,可改为true) if (dateGenerators == null || !dateGenerators.Any()) return false; // 按年份分组,逐个处理每一年的数据 var yearGroups = dateGenerators.GroupBy(dg => dg.GeneratedDate.Year); foreach (var yearGroup in yearGroups) { int currentYear = yearGroup.Key; var allDatesInYear = yearGroup.Select(dg => dg.GeneratedDate).ToList(); // 统计每个月份的出现次数,次数代表该年的数据组数 var monthOccurrenceCount = allDatesInYear .GroupBy(date => date.Month) .ToDictionary(group => group.Key, group => group.Count()); // 获取该年最多有几组数据 int maxGroupCount = monthOccurrenceCount.Values.Max(); // 检查每一组数据是否都覆盖12个月份 for (int groupNum = 0; groupNum < maxGroupCount; groupNum++) { // 提取当前组包含的所有月份(每个月份取第groupNum次出现的记录) var currentGroupMonths = monthOccurrenceCount .Where(kv => kv.Value > groupNum) .Select(kv => kv.Key) .ToList(); // 验证当前组是否包含1-12月全部月份 if (!Enumerable.Range(1, 12).All(month => currentGroupMonths.Contains(month))) { Console.WriteLine($"年份 {currentYear} 的第 {groupNum + 1} 组数据缺失月份"); return false; } } } // 所有年份的所有组都符合要求 return true; }
逻辑说明
- 年份分组:先将所有日期按年份归类,确保逐个处理每一年的数据
- 重复组识别:通过统计每个月份的出现次数,判断该年是否存在多组数据(次数大于1则说明有多组)
- 组内验证:对每一组数据,提取对应组的月份集合,检查是否覆盖1-12月的全部月份
- 边界处理:空列表直接返回验证不通过,可根据实际业务需求调整
内容的提问来源于stack exchange,提问作者kumar425
相关产品推荐
相关产品推荐

