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

Bry*_*yce 3 c# linq linq-to-sql

嗨,我正在尝试分组,然后在结果中构建我自己的类。我知道 group by 的结果是一个 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
                 } )
Run Code Online (Sandbox Code Playgroud)

目标是拥有按 FlightType 分组的 FlightTimesResult(FlightTime + 额外标志)的集合。不确定如何访问查询“select new FlightTimeResult()”中的各个 FlightTime 行

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

非常感谢。

Kri*_*izz 5

最简单的方法是通过以下方式显式调用 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)
                    }
               );
Run Code Online (Sandbox Code Playgroud)

两个参数的GroupBy操作者功能需要两个lambda表达式作为参数-一个用于提取密钥,第二为它提取值。

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

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