问题
I have a nested list, something like this:
List<Hotel> Hotels;
public class Hotel
{
List<RoomType> RoomType;
}
public class RoomType
{
Room Room;
}
public class Room
{
int RoomId;
}
It's a little convoluted, sorry couldn't think of a better mockup model. The Idea is that I have many hotels, each hotels has many room types, and assume each room type has exactly one room object.
Now from Hotels list, I just want to select all RoomId
's.. I am stuck here, while trying to nest all list..
right now, I am trying this:
//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.
How do I do this please?
Accessing all id's of all items in a nested list.. occasionally it complains of cannot convert int to boolean
and I do not know what it means...
Thanks.. hope the question was understanble
回答1:
While the hierarchy you posted above really doesn't make much sense to me (seems RoomType and Room are backwards), I'll post an example to go with it:
Hotels.SelectMany(h => h.RoomType)
.Select(rt => rt.Room.Id)
.Distinct()
.ToArray();
回答2:
Sounds like you need a Select for the RoomType.Room.Id rather than SelectMany. Using the Query syntax (which I typically prefer over lambda syntax for SelectMany, it would be
var query = (from hotel in Hotels
from type in Hotel.RoomType
select type.Room.Id)
.Distinct.ToArray();
Here you have a SelectMany between Hotels and Roomtype, but not one between type and Room.
回答3:
Here is another approach using GroupBy
(without Distinct
):
int[] allRoomIds = Hotels.SelectMany(h => h.RoomType)
.GroupBy(rt => rt.Room.Id)
.Select(room => room.Room.Id)
.ToArray();
If you will need the list of object:
List<Room> allRooms = Hotels.SelectMany(h => h.RoomType)
.GroupBy(rt => rt.Room.Id)
.Select(room => room.First())
.ToList();
来源:https://stackoverflow.com/questions/7363730/linq-on-a-nested-list-select-all-ids