2010-11-15 35 views
0

我正在使用c#中的lambda表達式。我試圖根據類型選擇一個值,然後對結果進行求和。查詢的Lambda表達式根據條件選擇不同的值

var length = (from al in tmp 
       from n in al 
       where n.TripPath.DataType =="type1" || n.tripPath.DataType == "Type2" 
       select n.trippath.length).sum(); 

這工作得很好,但我的問題是我需要總結之前,對於其他類型的瓦萊斯設置爲defalute值爲0,類似於

List<double> ActualLength = new List<double>(); 

    if(n.TripPath.DataType =="type1" || n.tripPath.DataType == "Type2") 
     ActualLength.Add(n.trippath.length) 
    else 
     ActualLength.Add(0); 

    return ActualLength.sum(); 
+0

請使用所提供的語言或工具標記問題。沒有人知道C#並且正在查看C#標籤會知道這個問題存在。 – 2010-11-15 08:18:15

+3

爲什麼你需要將它設置爲0?如果過濾它們的地方,它們被排除在選擇之外而不包括在總和中。這與設置爲0的效果相同。 – 2010-11-15 08:24:19

+0

Pieter是正確的。另外一點是'Enumerable.Empty ().Sum()'或類似的是'0'。這2點使附加過濾器變得冗餘。 – Ani 2010-11-15 08:31:01

回答

-1

看看在OfType擴展方法。然後,您可以投影到一個匿名類型來分配一個默認值並將.Sum關閉。

0

如果我理解正確的話,你想是這樣的:

var projection = 
    tmp.SelectMany(x => x) 
     .Select(x => { 
      if(x.TripPath.DataType == "type1" || x.TripPath.DataType == "type2") { 
       return new { Item = x, Length = x.TripPath.Length }; 
      } 
      else { 
       return new { Item = x, Length = 0 }; 
      } 
     }); 

那麼你可以說

int length = projection.Sum(x => x.Length); 

這是如何完成它好像你正在嘗試做的(項目每個項目將謂詞與其長度相匹配,否則將其投影到零)。

但是,您的使用看起來像你甚至沒有使用預測。在這種情況下,你可以逃脫不匹配謂語不打是求和,因此他們沒有任何貢獻的總和序列

return tmp.SelectMany(x => x) 
      .Where(x => 
       x.TripPath.DataType == "type1" || 
       x.TripPath.DataType == "type2" 
     ) 
      .Sum(x => x.TripPath.Length); 

項目。

相關問題