【问题标题】:Linq on a nested List - select all Id's嵌套列表上的 Linq - 选择所有 Id
【发布时间】:2017-10-18 18:09:51
【问题描述】:

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

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. 

请问我该怎么做?

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

谢谢..希望问题是可以理解的

【问题讨论】:

标签: c# linq nested-lists


【解决方案1】:

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

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

【讨论】:

  • 我认为 OP 需要从 Hotel.Rooms 集合中获取 ID
  • @James - 我也是,但上面发布的 OP 的类定义与 LINQ 查询不匹配。我要退出上面发布的课程。我在答案中添加了一条注释,提到这些类似乎倒退了。
  • @Justin,对不起,这甚至与我的模型无关我只是想凭空捏造一些东西 - 只是说我需要在嵌套列表中选择 id,所以就写了这个没有经过深思熟虑。
  • @Justin,是的,这行得通!我现在想知道为什么我第二次尝试selectMany 而不仅仅是select - 可能是因为今天下午我喝了几杯啤酒作为同事的送别派对!感谢您的帮助!
【解决方案2】:

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

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

这里您在 Hotels 和 Roomtype 之间有一个 SelectMany,但在 type 和 Room 之间没有一个。

【讨论】:

  • 嗨,你喜欢查询语法而不是 lambda 有什么原因吗?你说得对,我只需要select,而不是selectmany
  • 我只是发现对于来自 SQL 世界的 SelectMany 和 Group 的查询语法更具人类可读性。我想这都是个人喜好。考虑link 中的示例,将 Rx SelectMany 与查询表达式与 lambdas 作为一个中等复杂示例进行比较。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多