2014-09-10 61 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