私は次のようなネストされたリストを持っています:
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
と文句を言うことがあり、それが何を意味するのかわかりません。
ありがとう..質問が理解できたことを願っています
上に投稿した階層は私にはあまり意味がありませんが(RoomTypeとRoomは逆になっているようです)、それに合わせて例を投稿します。
Hotels.SelectMany(h => h.RoomType)
.Select(rt => rt.Room.Id)
.Distinct()
.ToArray();
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つはありません。
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();