嵌套列表上的Linq - 选择所有Id

时间:2011-09-09 15:09:57

标签: c# linq nested-lists

我有一个嵌套列表,如下所示:

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. 

我该怎么做?

访问嵌套列表中所有项目的所有ID ..偶尔会抱怨cannot convert int to boolean而我不知道这意味着什么......

谢谢..希望这个问题不容置疑

3 个答案:

答案 0 :(得分:28)

虽然您在上面发布的层次结构对我来说真的没有多大意义(似乎RoomType和Room是倒退的),但我会发布一个示例来配合它:

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

答案 1 :(得分:10)

听起来你需要选择RoomType.Room.Id而不是SelectMany。使用Query语法(我通常更喜欢SelectMany的lambda语法,它将是

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

此处您在Hotels和Roomtype之间有一个SelectMany,但在类型和Room之间没有。

答案 2 :(得分:0)

以下是使用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();