Как использовать агрегатную функцию в linq

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