我只想计算订阅结束日期在下个月内的用户:
int Count = oUsers
.Where(x =>
0 < x.SubscriptionEnddate.Value.Subtract(DateTime.Now).Days < 30)
.Count();
但它不起作用。
我想要做的是 0&lt;价值&lt; 30
答案 0 :(得分:4)
使用&&
。期。这是它的设计目标。
您可以通过创建Between
扩展方法或连接两个Where
子句来规避这一点,但实际上,为什么要在&&
之间进行交易。但如果你坚持:
int c = oUsers
.Select(x=> x.SubscriptionEnddate.Value.Subtract(DateTime.Now.AddDays(30)).Days)
.Where(d => 0 < d)
.Where(d => d < 30)
.Count();
答案 1 :(得分:0)
你可以尝试这样的事情
int count = oUsers.Where(x=> x.Days > 0).Count(x => x.Days < 30);
答案 2 :(得分:0)
我会这样做以保持可读性:
int Count =
oUsers
.Select(u => new
{
u,
days = u.SubscriptionEnddate.Value.Subtract(DateTime.Now.AddDays(30)).Days,
})
.Where(x => x.days > 0 && x.days < 30)
.Select(x => x.u)
.Count();
这显然使用&&
,但它消除了代码重复,我认为这是你真正想要避免的。
最后使用.Count()
无需跟踪原始值,因此,正如Patrick已经发布的那样,这就足够了:
int Count =
oUsers
.Select(u => u.SubscriptionEnddate.Value.Subtract(DateTime.Now.AddDays(30)).Days)
.Where(x => x > 0 && x < 30)
.Count();
答案 3 :(得分:0)
并不总是越短越好。
当其他人阅读您的代码时,当您调用SomeRange方法时,他将更容易理解
我认为最好的原因是当代码更具可读性时,如果您的值与开始和结束范围匹配并调用它,您可以执行返回方法。
某些int范围的示例,但同样可以检查日期的原因
public static bool SomeRange(int value,int start,int end)
{
return (value > start && value < end);
}
static void Main()
{
List<int> valueList = new List<int> { 1,65,3,76,34,23,11,5,665,334};
var result = valueList.Where(x => SomeRange(x, 0, 30)).Count();
}
答案 4 :(得分:0)
是使用Enumerable.Range解决它:
oUsers.Where(x => x.SubscriptionEnddate != null && Enumerable.Range(0, 30).Contains(x.SubscriptionEnddate.Value.Subtract(DateTime.Now).Days)).Count()
;
答案 5 :(得分:0)
我会说,在执行计数之前预先计算范围的开始和结束,然后比较start && end
:
// some test data
var oUsers = Enumerable.Range(0, 100).Select(x => new { SubscriptionEnddate = (DateTime?)DateTime.Now.AddDays(x) });
var rangeStart = DateTime.Now;
var rangeEnd = rangeStart.AddDays(30);
// Conditional count... can also be done as .Where(condition).Count()
int Count = oUsers.Count(x => x.SubscriptionEnddate >= rangeStart && x.SubscriptionEnddate < rangeEnd);
可能会使用DateTime.Today
,因为您只对几天感兴趣。
答案 6 :(得分:-1)
如果你真的反对使用&&
if x.SubscriptionEnddate.Value.Subtract(DateTime.Now.AddDays(30)).Days > 0 {
if x.SubscriptionEnddate.Value.Subtract(DateTime.Now.AddDays(30)).Days < 30 {
int count = oUsers;
}
}
这似乎是一种令人难以置信的迟钝的方式。这就是我们拥有&&
运算符的原因。