Linq on a nested List - select all Id's

流过昼夜 提交于 2019-12-04 10:18:01

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!