Как мне обрабатывать дочерние списки и получать новые списки объектов в C # с помощью LINQ? - PullRequest
0 голосов
/ 04 марта 2009

У меня есть запрос LINQ, который дает мне список с несколькими дочерними списками, все с двойными значениями.

Я хочу получить queryResult от этого.

Как я могу получить первое, последнее, самое высокое и самое низкое двойное значение?

Должен ли это быть новый объект и должны ли новые возвращаемые значения быть списком?

Ответы [ 2 ]

1 голос
/ 05 марта 2009

это правда, что версия с ручным кодом будет немного быстрее, но если вы не знаете, что производительность является ключевой проблемой вашего приложения, я бы не стал беспокоиться об этом. Версия кода LINQ будет выглядеть следующим образом:

  IEnumerable<List<double>> queryResults = /*...*/

  var aggregates =
    from ds in queryResults
    select new {
      First = ds[0], Last = ds[ds.Count - 1],
      Lowest = ds.Min(), Highest = ds.Max() };

Я думаю, что это определенно легче читать :-). Если вложенная вещь (ds) не относится к типу List, вам нужно будет использовать методы расширения First() и Last() вместо прямой индексации.

Обратите внимание, что если вы заинтересованы в производительности, вы также можете использовать Parallel LINQ, который выполняет запрос в нескольких потоках. Для краткого списка нет реальной причины делать это, но если коллекция большая, она может дать вам лучшую производительность (лучше, чем однопоточная версия с ручным кодированием).

0 голосов
/ 04 марта 2009

Ваш вопрос довольно неясен. Однако, похоже, у вас есть серия объектов списка, которые возвращаются из запроса LINQ, и вы хотите получить некоторые агрегаты из значений во всех этих подсписках. Я никогда не видел, как сделать это в LINQ, и, честно говоря, я не думаю, что производительность, вероятно, будет такой большой, даже если бы был способ сделать это. Агрегаты, которые вы ищете, довольно просто рассчитать вручную с помощью цикла. Примерно так:

 double min = 200000000;
 double max = -200000000;
 double first = 0;
 double last = 0;
 bool hasFoundFirst = false;
 foreach ( List<double> childList in queryResults )
 {
      foreach ( double val in childList )
      {
           if ( !hasFoundFirst )
           {
                hasFoundFirst = true;
                first = val;
           }

           if ( val < min )
              min = val;
           if ( val > max )
              max = val;
           last = val;
      }
 }

Нечто подобное даст вам результаты, которые вы ищете, очень эффективным способом. Такие вещи, если вы можете эффективно их кодировать, работают быстрее, чем LINQ. LINQ великолепен, и я использую его для многих вещей, но это всего лишь один из многих инструментов.

...