【问题标题】:Insert distinct value to list c#将不同的值插入列表c#
【发布时间】:2016-10-11 17:26:31
【问题描述】:

假设我有这 2 个类:

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

public class Room
{
    private List<Chair> chairs;
....

然后我声明一个二维数组变量并赋值:

BlockBuilding[,] bB= new BlockBuilding[2,1];

Room room = new Room();
BlockBuilding b1 = new BlockBuilding();
BlockBuilding b2 = new BlockBuilding();

b1.getRooms().Add(room);
b2.getRooms().Add(room);

bB[0,0] = b1;
bB[1,0] = b2;

Chair c1 = new Chair();
Chair c2 = new Chair();

bB[0,0].getRooms()[0].getChairs().Add(c1);
bB[1,0].getRooms()[0].getChairs().Add(c2);

假设所有必要的数据都在那里并且没有 NullException 问题,当我尝试在 bB[0,0] 和 bB[1,0] 中显示椅子时,令人惊讶的是它们都包含 c1 和 c2 而它们中的每一个应该只包含一把椅子。

以上代码结构与我的代码相似,由于披露协议的限制,不允许披露我的代码。我已经被这个错误困扰了好几个星期了。任何帮助将不胜感激!

【问题讨论】:

  • 你有一个单人间。那为什么不包含两把椅子呢?
  • 您为两座建筑添加了同一个房间。
  • 我认为房间是按值而不是按引用添加的。那我会尝试从这个方向解决问题。
  • 您创建一个房间room,然后将其添加到两栋建筑b1b2。它不是“按价值添加”,您正在向两座建筑物添加对相同对象的引用。您只需要实例化两个单独的房间并将它们添加到各自的建筑物中。就像您如何创建两把椅子一样

标签: c# arrays list multidimensional-array


【解决方案1】:

你应该使用两个不同的房间,因为它是一个参考,你正在为两个 BlockBuildings 添加同一个房间...

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

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

【讨论】:

  • 在 add 方法中创建房间而不是房间变量。
  • 是的,这是另一种方式,但是对于新开发者来说是很难理解的:)
  • @deathismyfriend:使用 OP 的代码,我认为创建 room1room2 变量并将椅子分配给它们并避免整个 bB[0,0].getRooms()[0].getChairs().Add(c1); 部分实际上会更容易看起来真的很丑。
【解决方案2】:

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

如果您想要“按值复制”功能,您需要使用struct(请务必先阅读一些“C# 值与引用类型”文章,例如References and Values)。

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

【讨论】:

    【解决方案3】:

    谢谢各位!事实上,我是 C# 的新手,我的项目严重依赖它。有用的答案太多了,我实际上不能将任何人评为“最”有用的答案,因为你们所有人都是最好的!是的,问题出在单个 Room 实例上,为每个 BlockBuilding 创建不同的 Room 实例将立即解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多