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();