如何将元素分组,然后在LINQ中选择新的类(最好是C#)

本文关键字:选择 元素 LINQ 然后 | 更新日期: 2023-09-27 18:27:53

嗨,我正试图了解分组,然后在结果中构建自己的类。我知道分组依据的结果是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+额外标志)的集合按FlightType分组。不确定如何访问查询"select new FlightTimeResult()"中的各个FlightTime行

我需要在groupedFlights上使用嵌套查询吗?

非常感谢。

如何将元素分组,然后在LINQ中选择新的类(最好是C#)

通过以下方式显式调用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运算符函数采用两个lambda作为参数,一个用于提取键,另一个用于为其提取值

还要记住,group-by-操作(无论是group itm by key构造还是GroupBy调用)返回一个IGrouping<,>集合,而不是一个。

因此它将是IEnumerable<IGrouping<,>>IQueryable<IGrouping<,>>

我认为你走在了正确的轨道上。与其按FlightType对FlightTime进行分组,不如尝试构建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;