在线等!C#Linq问题求教!

雪狐 2014-10-27 11:50:33
需求是这样:我有一个List<A>对象,A类中有Quantity和OrderDate字段,我现在要对符合日期的Quantity字段求和,比如:我要对OrderDate 在2014-10月的订单的销售量求和,那么其Linq语句简单的表示法为:list.Where(x => x.OrderDate >= new Date(2014,10,1) && x.OrderDate <= new Date(2014-10-31).Sum(x => x.Quantity),对2014-10月有数据的情况下,其结果没有问题。现在的要求是:如果2014-10月份没有数据,其结果要显示“--”,注意:与0不一样。
现在的做法是我先any方法判断是否有数据,然后再求和。如下:
if(list.Ayn(x => x.OrderDate >= new Date(2014,10,1) && x.OrderDate <= new Date(2014-10-31)){
sum = list.Where(x => x.OrderDate >= new Date(2014,10,1) && x.OrderDate <= new Date(2014-10-31).Sum(x => x.Quantity)
}
个人觉得这种写法性能比较低下。后来改成先where,然后对where的结果在求和这种方式:如下:
var query = list.where(x => x.OrderDate >= new Date(2014,10,1) && x.OrderDate <= new Date(2014-10-31);
if(query.any()){
sum = query.sum(x => x.Quantity);
}
改成这种写法后,Resharper报:Possible multiple enumeration of IEnumerable警告。
请问大神们,教小弟一个更好的写法,谢谢!
...全文
187 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪狐 2014-10-27
  • 打赏
  • 举报
回复
这只是我举的一个例子,我具体的项目中,包括很多这样的运算,都是财务相关的,有可能是负值。谢谢楼上的老兄。
winnowc 2014-10-27
  • 打赏
  • 举报
回复
如果求和的结果不会为负,可以这么写:
list.Where(...).DefaultIfEmpty(new A { Quantity = -1 }).Sum(x => x.Quantity)
判断结果是-1就是没有数据
winnowc 2014-10-27
  • 打赏
  • 举报
回复
引用 2 楼 foxflyhigher 的回复:
这只是我举的一个例子,我具体的项目中,包括很多这样的运算,都是财务相关的,有可能是负值。谢谢楼上的老兄。
总之使用DefaultIfEmpty的方案是需要一个特殊值,比如decimal求和可以用Decimal.MinValue,这也是不可能在财务相关求和中出现的值。 还有个办法,就是用Aggregate代替Sum,结果会成为nullable,null就是没数据:
list.Where(...).Aggregate((int?)null, (x, next) => (x ?? 0) + next.Quantity);
如果不是对数据库查询,Any()的开销非常小,Resharper的提醒可以忽略,代码看起来还能好懂点。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧