嵌套列表中的 Linq - 选择所有 ID

Linq on a nested List - select all Id's

提问人:LocustHorde 提问时间:9/9/2011 更新时间:10/18/2017 访问量:53914

问:

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

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

谢谢。。希望这个问题是可以理解的

c# LINQ 嵌套列表

评论

1赞 Michael Freidgeim 6/3/2020
这回答了你的问题吗?将所有子级都放到一个列表中 - 递归 C#

答:

55赞 Justin Niessner 9/9/2011 #1

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

Hotels.SelectMany(h => h.RoomType)
      .Select(rt => rt.Room.Id)
      .Distinct()
      .ToArray();
11赞 Jim Wooley 9/9/2011 #2

听起来您需要 Select 来表示 RoomType.Room.Id 而不是 SelectMany。使用 Query 语法(我通常更喜欢 SelectMany 的 lambda 语法,它是

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

在这里,您在酒店和房间类型之间有一个 SelectMany,但在类型和房间之间没有一个。

0赞 Shahar Shokrani 10/18/2017 #3

这是另一种使用(没有)的方法:GroupByDistinct

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