Как обрабатывать дочерние списки и получать новые списки объектов в C# с помощью LINQ?

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

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

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

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


person Community    schedule 04.03.2009    source источник
comment
Пожалуйста, дайте пример кода - трудно понять, какова ваша ситуация на данный момент.   -  person Jon Skeet    schedule 04.03.2009
comment
stackoverflow.com/questions/611441 / я должен начать новый поток..   -  person    schedule 04.03.2009
comment
numsy, пожалуйста, предоставьте здесь четкий пример того, что вы пытаетесь сделать, я перешел по ссылке, но я думаю, что то, что вы имеете в виду в этом посте, теряется из-за ситуации, которую вы хотели решить там.   -  person eglasius    schedule 04.03.2009


Ответы (2)


это правда, что версия с ручным кодом будет немного быстрее, но если вы не знаете, что производительность является ключевой проблемой вашего приложения, я бы не стал беспокоиться об этом. Версия кода 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, который выполняет запрос в нескольких потоках. Для короткого списка нет реальной причины делать это, но если коллекция большая, это может дать вам лучшую производительность (лучше, чем однопоточная версия с ручным кодированием).

person Tomas Petricek    schedule 05.03.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 великолепен, и я использую его для многих целей, но это всего лишь один из многих инструментов.

person x4000    schedule 04.03.2009