#.net #xml #vb.net #linq #aggregate
#.net #xml #vb.net #linq #агрегат
Вопрос:
Я хочу получить среднее значение этого запроса.
From d In (From c In location.Descendants("temperature") Where c.Attribute("type").Value = "hourly" Select c).Descendants("value")
Take 3
Select d
Я вижу ключевое слово aggregate в раскрывающемся списке автозаполнения, но я не могу понять, как его применить. Можете ли вы дать мне несколько советов?
Ответ №1:
@Muzz выше отмечает метод расширения Average(), но Aggregate также является полезной функцией:
Для получения хорошего примера Aggregate
функции в действии, попробуйте здесь . Итак, вы могли бы попробовать что-то вроде следующего:
myList = location.Descendants("temperature")
.Where(c => c.Attribute("type").value == "hourly")
.Select(...)
average = myList.Aggregate( (i1, i2) => i1 i2) / myList.Length
Извините за мое преобразование в лямбда-синтаксис, и я пропустил бит, где вы на самом деле получаете целочисленное значение, которое вам нужно. The .Агрегатная функция немного похожа 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)
Комбинируя выражения Linq, например Aggregate
, с особенно краткими лямбда-выражениями C #, вы можете написать действительно выразительный, но очень мощный код. Если у вас есть какой-либо опыт работы с функциональным языком, вы можете представить эти конструкции LINQ в этих терминах.
Комментарии:
1. По возможности вы должны публиковать примеры кода на том же языке, который использует OP.
Ответ №2:
Просто используйте метод среднего расширения. (выражение).Average()
например
(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()