2014-09-10 62 views
4

当我的模型有价值观,我可以很容易地使用此代码Linq如何获得平均值当所有值等于null或0? MVC

@Model.Where(a => a.count!= null).Average(a => a.totalday).ToString() 

例如获得平均:

count = 7 totalday= 3 average= 2.33

但是,当我的模型值等于空我不能得到平均值或零。正如你所知道的,我们不能将0分成0或者把null分成null。

我的意思是;

count = 0 or null; totalday= 0 or null; average= ????

如果所有的值都是空的,我怎么能写我的表为“0”或像一个字符串“没有任何平均”

我试过很多东西,但我得到一个错误。

+0

你可以尝试'以下@ Model.Where(A => a.count!= NULL).DefaultIfEmpty(0)。平均(A => a.totalday)的ToString()'? – chridam 2014-09-10 11:10:16

+0

感谢您的快速回复。我得到这个错误: 在“.... dll”中发生类型'System.NullReferenceException'的异常,但未在用户代码中处理 – ispanak 2014-09-10 11:14:12

+0

这是因为无论Model返回的默认值是否为null。要么提供另一个默认值,要么使用我在第一个项目下使用'totaldays'的解决方案。 – Dirk 2014-09-10 11:19:15

回答

14

这真的取决于你想做什么。如果你确定具有某种对于一般的默认值,那么你可以使用DefaultIfEmpty

@Model.Where(a => a.count!= null) 
     .Select(a => a.totalday) 
     .DefaultIfEmpty(0) 
     .Average() 
     .ToString() 

但是,如果这将是更好的展示完全是另一回事,那么你就必须先检查是否有任何过滤顺序中的元素。

1

零列表在您的列表中没有问题。

var list = new List<int>{ 0,1,2,3,4,5,6}; 
var avg = list.Average(); // avg = 3 

你可能想照顾你空的,虽然,但你可以很容易地筛选出来,如:

var not_null_list = some_list.Where(item => item != null); 

从那里,你应该确定(除非你需要考虑号码这是空的,这并没有太大的意义,我认为......)

编辑
我看到你的困境。我建议在这种情况下:)

var list = new List<int>{}; 
string answer; 
if (list.Any()) 
    answer = list.Average(); 
else 
    answer = "User is a shmartsy pants. Try again with valid data"; 
+0

问题是如果列表中有**只有**空值,或者列表是空的,那么'Average'会抛出异常。 – Dirk 2014-09-10 11:28:29