2011-11-01 43 views
0

我想獲得此查詢的平均值。如何在linq中使用聚合函數

From d In (From c In location.Descendants("temperature") Where c.Attribute("type").Value = "hourly" Select c).Descendants("value") 
       Take 3 
       Select d 

我可以看到自動完成下拉列表中的聚合關鍵字,但我不知道如何應用它。你能給我一些指點嗎?

回答

1

只需使用平均擴展方法即可。 (表達式)。平均值()

例如上述

(From d In (From c In location.Descendants("temperature") Where c.Attribute("type").Value = "hourly" Select c).Descendants("value") 
      Skip GetTimeOffset() Take 1 
      Select d).Average() 
4

@Muzz注意到平均()擴展方法,但骨料是一種有用的功能也:

對於行動Aggregate功能的一個很好的例子,嘗試here。所以,你可以嘗試像以下:

myList = location.Descendants("temperature") 
      .Where(c => c.Attribute("type").value == "hourly") 
      .Select(...) 

average = myList.Aggregate((i1, i2) => i1+i2)/myList.Length 

原諒我轉換爲拉姆達語法,我已經離開了那裏一點你真正得到你需要的整數值。該.Aggregate功能有點像fold_left從功能性的語言:

(new [] {1, 2, 3, 4}).Aggregate((i1, i2) => i1+i2) 

是喜歡寫作:

((1 + 2) + 3) + 4 

要從鏈接使用示例,你可以實現做一個逗號分隔的列表:

IQueryable<String> ListOfStrings = ... 
ListOfStrings.Aggregate((s1, s2) => s1 + ", " s2) 

通過像Aggregate用C#的結合LINQ表達式特別簡潔的lambda表達式,你可以寫去表達,但非常強大的代碼。如果你對函數式語言有任何經驗,那麼你可以用這些術語來思考這些LINQ結構。

+1

如果可能,您應該使用與OP使用相同的語言發佈代碼示例。 – vcsjones

+0

@vcsjones同意 - 我現在就改正。 – jelford