C# 在列表c中插入不同的值#

C# 在列表c中插入不同的值#,c#,arrays,list,multidimensional-array,C#,Arrays,List,Multidimensional Array,假设我有两门课: public class BlockBuilding { private List<Room> rooms; ... public class Room { private List<Chair> chairs; .... 假设所有必要的数据都存在,并且不存在NullException问题,当我尝试在bB[0,0]和bB[1,0]中显示椅子时,令人惊讶的是,它们都包含c1和c2,而每个都应该只包含一把椅子 以上所有代码结构与我的代码类

假设我有两门课:

public class BlockBuilding
{
    private List<Room> rooms;
...

public class Room
{
    private List<Chair> chairs;
....
假设所有必要的数据都存在,并且不存在NullException问题,当我尝试在bB[0,0]和bB[1,0]中显示椅子时,令人惊讶的是,它们都包含c1和c2,而每个都应该只包含一把椅子


以上所有代码结构与我的代码类似,由于披露协议的限制,不允许披露我的代码。这只虫子已经缠了我好几个星期了。任何帮助都将不胜感激

您应该使用两个不同的房间,因为它是一个参考,您正在为两个区块建筑添加相同的房间

Room room1 = new Room();
Room room2 = new Room();
BlockBuilding b1 = new BlockBuilding();
BlockBuilding b2 = new BlockBuilding();

b1.getRooms().Add(room1);
b2.getRooms().Add(room2);

您应该使用两个不同的房间,因为它是一个参照,您正在为两个区块建筑添加相同的房间

Room room1 = new Room();
Room room2 = new Room();
BlockBuilding b1 = new BlockBuilding();
BlockBuilding b2 = new BlockBuilding();

b1.getRooms().Add(room1);
b2.getRooms().Add(room2);

class
是通过引用传递的,因此您向两个房间添加了相同的对象

如果您想要“按值复制”功能,您需要使用
struct
(请确保首先阅读一些“C#value vs.reference types”之类的文章)


或者,您可以在添加到列表之前对对象进行深度复制()。

类通过引用传递,因此您将同一对象添加到两个房间

如果您想要“按值复制”功能,您需要使用
struct
(请确保首先阅读一些“C#value vs.reference types”之类的文章)


或者,您可以在添加到列表之前对对象进行深度复制()。

谢谢大家!事实上,我是C#的新手,我的项目在很大程度上依赖于它。有太多有用的答案,我不能把任何人评为“最”有用的答案,因为你们都是最好的!是的,问题是单房间实例,为每个街区创建不同的房间实例将立即解决问题

谢谢大家!事实上,我是C#的新手,我的项目在很大程度上依赖于它。有太多有用的答案,我不能把任何人评为“最”有用的答案,因为你们都是最好的!是的,问题是单房间实例,为每个街区创建不同的房间实例将立即解决问题

你有一间单人房。那为什么它不能同时包含两张椅子呢?你把同一个房间添加到了两栋建筑中。我想这个房间是通过价值而不是参照物来增加的。我将尝试从这个方向解决问题。您创建一个房间,
房间
,然后将其添加到两个建筑
b1
b2
。它不是“按值添加”,而是将对同一对象的引用添加到两个建筑中。您只需要实例化两个独立的房间,并将它们添加到各自的建筑中。就像你创造了两张椅子一样,你有一个单独的房间。那为什么它不能同时包含两张椅子呢?你把同一个房间添加到了两栋建筑中。我想这个房间是通过价值而不是参照物来增加的。我将尝试从这个方向解决问题。您创建一个房间,
房间
,然后将其添加到两个建筑
b1
b2
。它不是“按值添加”,而是将对同一对象的引用添加到两个建筑中。您只需要实例化两个独立的房间,并将它们添加到各自的建筑中。就像你如何创建两张椅子,而不是让房间变量在add方法中创建房间一样。是的,这是另一种方式,但对于新开发人员来说是很难理解的:)@deathismyfriend:OP拥有的代码,我认为创建
room1
room2
变量并将椅子分配给它们会更容易,并避免整个
bB[0,0].getRooms()[0].getChairs().Add(c1)看起来很难看的部分。不是让房间变量在add方法中创建房间。是的,这是另一种方式,但对于新开发人员来说是很难理解的:)@deathismyfriend:使用OP拥有的代码,我认为创建
room1
room2
变量并将椅子分配给它们会更容易,并避免整个
bB[0,0].getRooms()[0].getChairs().Add(c1)看起来很难看的部分。