您好我正试图让我的头围绕分组,然后在结果中构建我自己的类。我知道group by的结果是一个IGrouping集合,但是我可以在构建它们的时候访问这些行,以便使用自定义类向它们添加几个标志吗?
我有一个名为FlightTimes的类,包含一些数据,但是我想在行中附加一些数据,比如FlagRedEye。所以我用原始的FlightTime类数据和标志创建了一个名为FlightTimeResult的类。
我可以这样做吗?我似乎无法弄清楚如何让它工作。我喜欢使用强类型,直到我理解发生了什么。我不得不改变一些事情来保护我的客户端,所以我为任何语法错误道歉。
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
} )
目标是拥有一个按FlightType分组的FlightTimesResult(FlightTime +额外标志)的集合。不确定如何访问查询'select new FlightTimeResult()'
中的各个FlightTime行我是否需要在groupedFlights上使用嵌套查询?
非常感谢。
答案 0 :(得分:4)
通过以下方式显式调用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)
}
);
two-argument GroupBy
operator function将两个lambdas作为参数 - 一个用于提取键,第二个用于提取值。
另请注意,分组操作(无论是group itm by key
构建还是GroupBy
调用)都会返回IGrouping<,>
s的集合 - 而不是一个。
因此它将是IEnumerable<IGrouping<,>>
或IQueryable<IGrouping<,>>
。
答案 1 :(得分:1)
我认为你走在正确的轨道上。不是通过FlightType对FlightTimes进行分组,而是尝试构建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;