如何使用LINQ统计List<TimeSheetEntry>中的唯一工作天数?
用LINQ统计考勤记录中的唯一工作天数
没问题,这事儿用LINQ处理起来非常简洁!核心思路就是提取每条记录的日期部分、去重,最后计数就行,我给你一步步拆解:
首先,假设你的TimeSheetEntry类结构大概是这样(和你提到的一致,包含ClockInTimeStamp属性):
public class TimeSheetEntry { public DateTime ClockInTimeStamp { get; set; } // 其他属性比如 UserId、ClockOutTimeStamp 之类的,不影响我们的统计逻辑 }
基础版:统计所有记录中的唯一工作天数
如果只是想统计整个列表里的唯一工作天数,直接用这几行LINQ就搞定:
// 先拿到你的考勤记录列表 List<TimeSheetEntry> allTimeSheets = GetYourTimeSheetData(); // 替换成你获取数据的方式 int totalUniqueWorkDays = allTimeSheets // 提取每条记录的日期部分(忽略时分秒,只保留年/月/日) .Select(entry => entry.ClockInTimeStamp.Date) // 去重,得到所有不重复的日期 .Distinct() // 统计去重后的日期数量,就是工作天数 .Count();
进阶版:按用户分组统计工作天数
如果你的列表里包含多个用户的记录,想要分别统计每个用户的工作天数,只需要加个分组操作:
var userWorkDayStats = allTimeSheets // 按用户ID分组(假设你的类里有UserId属性) .GroupBy(entry => entry.UserId) // 对每个分组统计唯一日期数量 .Select(group => new { UserId = group.Key, WorkDayCount = group .Select(e => e.ClockInTimeStamp.Date) .Distinct() .Count() }); // 遍历输出结果 foreach (var stats in userWorkDayStats) { Console.WriteLine($"用户 {stats.UserId} 的工作天数:{stats.WorkDayCount}"); }
额外优化:排除周末/节假日
如果需要排除周末(周六周日),可以在去重后加个过滤条件:
int workDaysExcludingWeekends = allTimeSheets .Select(entry => entry.ClockInTimeStamp.Date) .Distinct() // 过滤掉周六和周日 .Where(date => date.DayOfWeek != DayOfWeek.Saturday && date.DayOfWeek != DayOfWeek.Sunday) .Count();
要是需要排除节假日,你得有一个节假日的日期列表,然后用Contains来过滤就行,比如:
List<DateTime> holidayDates = GetHolidayDates(); // 你的节假日列表 int workDaysExcludingHolidays = allTimeSheets .Select(entry => entry.ClockInTimeStamp.Date) .Distinct() .Where(date => !holidayDates.Contains(date) && date.DayOfWeek != DayOfWeek.Saturday && date.DayOfWeek != DayOfWeek.Sunday) .Count();
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

