我有一些方法来获取特定年龄段的成员数量。该范围在两端都是应该包含的,即如果我叫CountSelection(memberList, 16, 19)
(其中memberList
是List<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()
,每次通话的范围都不同,理论上可以覆盖所有年龄段。
查询应如何保证所有成员都被计数?
答案 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
然后您可以在表示层的上限中减去一个。