Linq во вложенном списке - выберите все идентификаторы

У меня есть вложенный список, примерно такой:

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. 

Как мне это сделать?

Доступ ко всем идентификаторам всех элементов во вложенном списке. Иногда он жалуется на cannot convert int to boolean, и я не знаю, что это значит...

Спасибо.. надеюсь, что вопрос был недостаточно.

Ответ 1

Пока иерархия, которую вы разместили выше, действительно не имеет для меня большого смысла (кажется, RoomType и Room обратные), я отправлю пример, чтобы пойти с ним:

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

Ответ 2

Похоже, вам нужен Select для RoomType.Room.Id, а не SelectMany. Используя синтаксис Query (который я обычно предпочитаю синтаксис лямбда для SelectMany, это будет

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

Здесь у вас есть SelectMany между отелями и Roomtype, но не между типом и комнатой.

Ответ 3

Вот еще один подход с использованием GroupBy (без Distinct):

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

Если вам понадобится список объектов:

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