web-dev-qa-db-ja.com

ネストされたリストのLinq-すべてのIDを選択します

私は次のようなネストされたリストを持っています:

List<Hotel> Hotels;

public class Hotel
{
    List<RoomType> RoomType;
}

public class RoomType
{
    Room Room;
}

public class Room
{
    int RoomId;
}

それは少し複雑です、申し訳ありませんがより良いモックアップモデルを考えることができませんでした。アイデアは、私には多くのホテルがあり、各ホテルには多くの部屋タイプがあり、各部屋タイプには1つの部屋オブジェクトがあると想定するというものです。

ホテルリストから、すべての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と文句を言うことがあり、それが何を意味するのかわかりません。

ありがとう..質問が理解できたことを願っています

16
LocustHorde

上に投稿した階層は私にはあまり意味がありませんが(RoomTypeとRoomは逆になっているようです)、それに合わせて例を投稿します。

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

SelectManyではなくRoomType.Room.IdにSelectが必要なようです。クエリ構文(SelectManyのラムダ構文よりも通常は好む)を使用すると、次のようになります。

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

ここでは、ホテルと部屋タイプの間にSelectManyがありますが、タイプと部屋の間に1つはありません。

10
Jim Wooley

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();
0
Shahar Shokrani