嵌套列表上的Linq -选择所有Id'

本文关键字:Id 选择 列表 Linq 嵌套 | 更新日期: 2023-09-27 18:08:00

我有一个嵌套列表,像这样:

List<Hotel> Hotels;
public class Hotel
{
    List<RoomType> RoomType;
}
public class RoomType
{
    Room Room;
}
public class Room
{
    int RoomId;
}

有点复杂,对不起,我想不出更好的模型了。这个想法是,我有很多酒店,每个酒店有很多房间类型,并假设每个房间类型只有一个房间对象。

现在从酒店列表中,我只想选择所有的RoomId ..我被困在这里,而试图嵌套所有的列表..

现在,我正在尝试这个:

//cant do this some invalid error
int[] AllRoomIds = Hotels.selectMany(x => x.Rooms)
                       .selectMany(y => y.RoomType.Room.Id).Distinct().ToArray()
//cant do this - z doesnt have anything
int[] AllRoomIds = Hotels.selectMany(x => x.Rooms)
                         .selectMany(y => y.RoomType)
                         .select(z => z. 

请问我该怎么做?

访问嵌套列表中所有项的所有id ..偶尔它会抱怨cannot convert int to boolean,我不知道这是什么意思…

谢谢. .希望问题能理解

嵌套列表上的Linq -选择所有Id'

虽然你上面发布的层次结构对我来说真的没有多大意义(似乎RoomType和Room是向后的),我将发布一个例子:

Hotels.SelectMany(h => h.RoomType)
      .Select(rt => rt.Room.Id)
      .Distinct()
      .ToArray();

听起来您需要为RoomType.Room.Id选择而不是SelectMany。使用Query语法(对于SelectMany,我通常更喜欢它而不是lambda语法),它将是

var query = (from hotel in Hotels
            from type in Hotel.RoomType
            select type.Room.Id)
            .Distinct.ToArray();

这里在Hotels和Roomtype之间有一个SelectMany,但是type和Room之间没有。

下面是使用GroupBy(不含Distinct)的另一种方法:

int[] allRoomIds = Hotels.SelectMany(h => h.RoomType)
      .GroupBy(rt => rt.Room.Id)
      .Select(room => room.Room.Id)
      .ToArray();

如果你需要object的列表:

List<Room> allRooms = Hotels.SelectMany(h => h.RoomType)
     .GroupBy(rt => rt.Room.Id)
     .Select(room => room.First())
     .ToList();