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