如何在linq中使用聚合函数

时间:2011-11-01 23:54:15

标签: .net xml vb.net linq aggregate

我想获得此查询的平均值。

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

我可以在自动完成下拉列表中看到聚合关键字,但我无法弄清楚如何应用它。你能给我一些指示吗?

2 个答案:

答案 0 :(得分:4)

上面的@Muzz注意到了Average()扩展方法,但是Aggregate也是一个很有用的功能:

有关Aggregate函数的一个很好的示例,请尝试here。所以你可以尝试以下内容:

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

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

请原谅我对lambda语法的转换,我遗漏了你实际获得所需整数值的位置。 .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这样的Linq表达式与C#特别简洁的lambda表达式相结合,您可以编写真正富有表现力且非常强大的代码。如果您有使用函数式语言的经验,可以用这些术语来考虑这些LINQ结构。

答案 1 :(得分:1)

只需使用平均扩展方法即可。 (表达式)。平均()

e.g。

(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()