[英]References between objects
我已经尝试了好几天了。
我有三个班级,我们称它们为“城市”,“房屋”,“房间”:
class City
{
List<House> Houses { get; set; }
string Name { get; set; }
}
class House
{
List<Room> Rooms { get; set; }
string Name { get; set; }
}
class Room
{
string Name { get; set; }
}
因此,这里有一个拥有很多房屋的城市。 房屋拥有房间。
举例来说,假设我得到一个房间对象,该对象的名称(在整个系统中通过“城市”->“房屋”->“房间”分组)
我如何能够从我拥有的那个Room对象中引用City-objects Name变量?
就像做“ Room.House.City.Name”的一些神奇方法一样
我真的希望您了解我要问的问题,最近几天一直让我发疯。
为了使之成为可能,您必须在类中添加其他类似父类的引用:
class City
{
List<House> Houses { get; set; }
string Name { get; set; }
}
class House
{
List<Room> Rooms { get; set; }
string Name { get; set; }
City City { get; set; }
}
class Room
{
string Name { get; set; }
House House { get; set; }
}
更新资料
因为我认为没有城市没有房屋的房子和没有房屋的房间的机会不大,所以我将构造函数添加到House
和Room
类中,以将它们绑定到父母:
class House
{
public House(City city)
{
City = city;
}
List<Room> Rooms { get; set; }
string Name { get; set; }
City City { get; set; }
}
class Room
{
public Room(House house)
{
House = house;
}
string Name { get; set; }
House House { get; set; }
}
您可以将House
属性添加到您的房间,将City
属性添加到House
如下所示:
class House
{
List<Room> Rooms { get; set; }
string Name { get; set; }
public City City { get; set; }
}
class Room
{
string Name { get; set; }
public House House { get; set; }
}
例如,当您添加一些房屋和房间时:
City myCity = new City();
House myHouse = new House { City = myCity, Name = "myHome" };
Room myRoom = new Room { House = myHouse, Name = "myRoom" };
myHouse.Rooms = new List<Room>();
myHouse.Rooms.Add(myRoom);
myCity.Houses = new List<House>();
myCity.Houses.Add(myHouse);
// here you can use:
myRoom.House.City.Name
但这不是那么优雅,很难添加新的房屋和房间。此外,我将添加一些方法来简化它,例如在房屋类中:
class House
{
public void AddRoom(Room room)
{
room.House = this;
if (Rooms == null)
Rooms = new List<Room>();
Rooms.Add(room);
}
}
然后,我不需要定义这样的房间:
Room myRoom = new Room { House = myHouse, Name = "myRoom" };
代替:
myHouse.AddRoom(new Room { Name = "myRoom" });
您必须更改类以包含对其父级的引用,例如
class Room
{
House House { get; set; }
string Name { get; set; }
}
class House
{
List<Room> Rooms { get; set; }
string Name { get; set; }
City City { get; set; }
}
通常,您无法从属性导航到其容器。 仅当在“房间”对象中还具有“房屋”之类的属性,并且确保将“房间”分配为“房屋”时,还可以在“房间”中设置“房屋”属性,才有可能。
但是,您可以使用一些LINQ来获取城市名称,如下所示:
var cityWithSomeRoom = cities.Where(c = > c.Houses.Contains(h => h.Rooms.Contains(r => r.ReferenceEquals(someRoom))).FirstOrDefault();
cityWithSomeRoom.Name ; // this is your name
someRoom是您要查找所在城市的Room实例。 另外,请确保不要将同一房间对象添加到多个房屋中,因为ReferenceEquals会找到很多候选对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.