计算年龄段的人群

时间:2019-04-09 15:45:46

标签: c#

我有一些方法来获取特定年龄段的成员数量。该范围在两端都是应该包含的,即如果我叫CountSelection(memberList, 16, 19)(其中memberListList<Member>),则我希望得到16、17、18岁的成员数和19加起来:

private int CountSelection(List<Member> members, int minAge, int maxAge)
{
    DateTime from = DateTime.Now.AddYears(minAge * -1);
    DateTime to = DateTime.Now.AddYears(maxAge * -1);
    return members.Count(m =>
        m.DateBorn.Date <= from.Date && 
        m.DateBorn.Date >= to.Date);
}

但是,我的方法不可靠-有时它会忽略成员,我猜测生日是在两个日期之间。在主要方法中,我会多次拨打CountSelection(),每次通话的范围都不同,理论上可以覆盖所有年龄段。

查询应如何保证所有成员都被计数?

2 个答案:

答案 0 :(得分:0)

我发现了为什么我的方法失败了。我只是从起始和终止日期中减去整年,结果得到的范围看起来像这样(日期格式dd.mm.yyyy):

0-5 years - 11.04.2014-11.04.2019
6-12 years - 11.04.2007-11.04.2013
13-19 years - 11.04.2000-11.04.2006
20-26 years - 11.04.1993-11.04.1999
... and so on.

请注意,每个范围之间的间隔将近一年。

解决方案:

而不是像这样设置起始日期:

DateTime from = DateTime.Now.Date.AddYears(-maxAge);

我当然必须再减去1年再加上1天:

DateTime from = DateTime.Now.Date.AddYears(-maxAge + 1).AddDays(1);

现在范围看起来像这样:

0-5 years - 12.04.2013-11.04.2019
6-12 years - 12.04.2006-11.04.2013
13-19 years - 12.04.1999-11.04.2006
20-26 years - 12.04.1992-11.04.1999
... and so on.

最终可行的方法如下:

private int CountSelection(List<Member> members, int minAge, int maxAge)
{
    DateTime from = compareDate.AddYears(-maxAge+1).AddDays(1);
    DateTime to = compareDate.AddYears(-minAge);
    return members.Count(m => 
        m.DateBorn >= from && 
        m.DateBorn <= to);
}

答案 1 :(得分:0)

使用排他上限的范围更容易:

private int CountSelection(List<Member> members, int minAge, int maxAgeExclusive)
{
    DateTime from = compareDate.AddYears(-maxAgeExclusive);
    DateTime to = compareDate.AddYears(-minAge);
    return members.Count(m => m.DateBorn > from && m.DateBorn <= to);
}

现在您的范围在数学上将更加一致。

0-6 years
6-13 years
13-20 years
20-27 years
etc

然后您可以在表示层的上限中减去一个。