Как сгруппировать, а затем выделить элементы в новый класс в LINQ (предпочтительно C #) - PullRequest
3 голосов
/ 16 марта 2012

Привет, я пытаюсь разобраться в группировке, а затем строю свой собственный класс в результате.Я знаю, что результатом группы является коллекция IGrouping, но могу ли я получить доступ к строкам, когда они создаются, чтобы добавить к ним пару флагов с помощью пользовательского класса?

У меня есть класс FlightTimes с некоторыми данными, но я бы хотел добавить некоторые данные в строки, например, FlagRedEye.Поэтому я создал класс FlightTimeResult с исходными данными класса FlightTime и флагом.

Могу ли я это сделать?Я не могу понять, как заставить это работать.Я люблю использовать сильные типы, пока не пойму, что происходит.Мне пришлось изменить несколько вещей, чтобы защитить моего клиента, поэтому я извиняюсь за любые синтаксические ошибки.

IGrouping<string, FlightTimeResult> FlightTimes =
               ( from flighttimes in schedules.FlightTimes
                 group flighttimes by flighttimes.FlightType.ToString()
                     into groupedFlights
                 select new FlightTimeResult( )
                 {
                     FlightTimeData = FlightTime,   // Original class data
                     FlagRedEye = (FlightTime.departureTime.Hour >= 0 &&
                                  FlightTime.departureTime.Hour < 6) // Extra flag
                 } )

Цель состоит в том, чтобы собрать коллекцию FlightTimesResult (FlightTime + extra flag), сгруппированную по FlightType.Не знаете, как получить доступ к отдельным строкам FlightTime в запросе «выберите новый FlightTimeResult ()»

Нужно ли использовать вложенный запрос для groupedFlights?

Большое спасибо.

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Этого проще всего добиться явным вызовом функций Linq следующим образом:

IQueryable<IGrouping<string, FlightTimeResult>> query 
         = schedules.FlightTimes.GroupBy(
               ft => ft.FlightType.ToString(), // key 
               ft => new FlightTimeResult() { // your constructed objects for key
                    FlightTimeData = ft,
                    FlagRedEye = (ft.departureTime.Hour >= 0 && ft.departureTime.Hour < 6)
                    }
               );

Операторная функция с двумя аргументами GroupBy принимает в качестве аргументов два лямбда-выражения - один для извлечения ключей, второй для извлечения значений для него.

Также имейте в виду, что группировка по операции (будь то конструкция group itm by key или вызов GroupBy) возвращает коллекцию IGrouping<,> с, а не одну.

Таким образом, это будет IEnumerable<IGrouping<,>> или IQueryable<IGrouping<,>>.

1 голос
/ 16 марта 2012

Я думаю, вы на правильном пути.Вместо группировки FlightTimes по FlightType попробуйте создать FlightTimeResults и сгруппировать их по FlightType:

var results = 
    from ft in schedules.FlightTimes
    group new FlightTimeResult
        {
            FlightTimeData = ft,
            FlagRedeye = ft.DepartureTime.Hour >= 0 && ft.DepartureTime.Hour < 6
        }
    by ft.FlightType.ToString()
    into groupedFlights
    select groupedFlights;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...