我想知道是否有更好/更简单的方法来按生日加载用户。
我有一个 User 实例,它有属性,包括这个:
公共(public)日期时间?出生日期 { 得到;放; }
我想要做的是加载从一个日期到另一个日期有生日的用户:
public IEnumerable<User> LoadUsersByBirthday(DateTime from, DateTime into)
我不关心生日年份,例如,如果我有 3 个用户生日:
- 日期时间(1991, 3, 20);
- 日期时间(1990, 4, 25);
- 日期时间(1989, 3, 10);
LoadUsersByBirthday(new DateTime(2990, 3, 1), new DateTime(3013, 4, 15))
应该返回 2 个用户 - 第一个和第三个。
我的方法是这样的:
public IEnumerable<User> LoadUsersByBirthday(DateTime from, DateTime into)
{
var days = DateTime.DaysInMonth(from.Year, from.Month);
var u1 = _unit.User.Load(u => ((DateTime) (u.BirthDate)).Month == from.Month
&& ((DateTime) (u.BirthDate)).Day >= from.Day
&& ((DateTime) (u.BirthDate)).Day <= days);
var u2 = _unit.User.Load(u => ((DateTime) (u.BirthDate)).Month > from.Month
&& ((DateTime) (u.BirthDate)).Month < into.Month);
var u3 = _unit.User.Load(u => ((DateTime) (u.BirthDate)).Month == into.Month
&& ((DateTime) (u.BirthDate)).Day <= into.Day);
return u1.Concat(u2).Concat(u3);
}
它有效,但是有没有更好/更简单的方法来做到这一点?
最佳答案
我认为这应该可行:
public IEnumerable<User> UsersByBirthday(IEnumerable<User> users, DateTime from, DateTime to)
{
var fromNormalized = NormalizeDate(from);
var intoNormalized = NormalizeDate(into);
return users.Where(u => fromNormalized <= NormalizeDate(u.BirthDate) && NormalizeDate(u.BirthDate) <= intoNormalized);
}
public int NormalizeDate(DateTime date)
{
return date.Month * 100 + date.Day;
}
NormalizeDate()
方法返回一个整数值,表示易于比较的月份和日期。对于 9 月 3 日,它返回 903,对于 4 月 24 日,它返回 424。
如果 from > to
没有错误处理。
关于c# - 按生日加载用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17988026/