按生日加载用户

Art*_*713 5 .net c#

我想知道是否有更好/更简单的方式来加载用户的生日.

我有一个User实例,它有属性,包括这个:

public DateTime? BirthDate { get; set; }

我想要做的是加载从一个日期到另一个日期有bdays的用户:

public IEnumerable<User> LoadUsersByBirthday(DateTime from, DateTime into)
Run Code Online (Sandbox Code Playgroud)

我不关心生日年份,例如,如果我有3个生日用户:

  1. DateTime(1991,3,20);
  2. DateTime(1990,4,25);
  3. DateTime(1989,3,10);

LoadUsersByBirthday(new DateTime(2990, 3, 1), new DateTime(3013, 4, 15)) 应该返回2个用户 - 第1和第3.

我的方法看起来像这样:

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);
    }
Run Code Online (Sandbox Code Playgroud)

它有效,但有更好/更简单的方法吗?

Tor*_*lin 3

我认为这应该有效:

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;
}
Run Code Online (Sandbox Code Playgroud)

NormalizeDate()方法返回一个整数值,表示易于比较的月份和日期。对于 9 月 3 日,它返回 903,对于 4 月 24 日,它返回 424。

if 没有错误处理from > to