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

у меня есть вложенный список, что-то вроде этого:

List<Hotel> Hotels;

public class Hotel
{
    List<RoomType> RoomType;
}

public class RoomType
{
    Room Room;
}

public class Room
{
    int RoomId;
}

это немного запутанно, извините, не мог придумать лучшей модели макета. Идея в том, что у меня много отелей, в каждом отеле есть много типов номеров, и предположим, что каждый тип номеров имеет ровно один объект.

теперь из списка отелей, я просто хочу, чтобы выделить все RoomId ' s.. Я застрял здесь, пытаясь вложить весь список..

прямо сейчас, я пытаюсь это:

//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 и я не знаю, что это значит...

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

3 ответов


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

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

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

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

здесь у вас есть выбор между отелями и Roomtype, но не один между типом и номером.


вот еще один подход с использованием 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();