列表元素彼此依赖

时间:2019-02-25 12:39:08

标签: c# xna monogame

我列表(Maps = new List<CollisionTiles>[])中的某些元素相互依赖。此列表仅包含有关游戏中碰撞图块的对象,因此当我要将Map中的图块更改为Maps[Something]时,Maps也在更改。 但是,Maps仅在Maps.Count == 0时才应更改。 像这样:

if (mapClass.Maps[3].Count != 0)
{
    mapClass.ClearMap(); // CollisionTiles.Clear(); BackGroundTiles.Clear();
    mapClass.CollisionTiles = mapClass.Maps[3];
    mapClass.BackgroudTiles = mapClass.SpriteMaps[3];
}
if (mapClass.Maps[3].Count == 0)
{
    mapClass.GenerateCustomMap(64, 10, 8, 3, false);
}

2 个答案:

答案 0 :(得分:1)

从发布的代码中很难说出来,但是根据您的描述,当您打算复制集合本身时,可能会将“引用”复制到集合中。

例如,假设有一个名为a的列表,而您尝试创建另一个名为b的列表,如下所示:

var a = new List<string>();
var b = a;

以上代码的实际作用是使ab成为相同列表的“引用”。

换句话说,如果您随后执行了以下操作:

b.Add("item");

现在,两个名为ab的“列表”中将包含相同的项目。那是因为它们实际上不是不同的列表,它们是带有两个“指针”的相同列表。

有两种不同的方法可以正确地在C#中复制列表。一种方法是像这样将列表传递到构造函数中:

var a = new List<string>();
a.Add("item");
var b = new List<string>(a);

这将为您提供两个单独的列表,并且每个列表中都有一个项目。但是,现在,当您修改这些列表中的任何一个时,它们不会一起更改。

可以通过using System.Linq命名空间来完成上面代码的一种流行的(更现代的)替代方法。

var a = new List<string>();
a.Add("item");
var b = a.ToList();

我希望有帮助。

答案 1 :(得分:0)

您正在将mapClass.CollisionTiles设置为对原始List引用。 因此,对mapClass.CollisionTiles的任何修改也将更改原始ListBackgroundTiles也是如此。

要解决此问题,请在将新的List对象分配给mapClass时创建它们:

if (mapClass.Maps[3].Count != 0)
{
    mapClass.ClearMap(); // CollisionTiles.Clear(); BackGroundTiles.Clear();
    mapClass.CollisionTiles = new List<CollisionTiles>(mapClass.Maps[3]);
    mapClass.BackgroudTiles = new List<BackgroudTiles>(mapClass.SpriteMaps[3]);
}
else // this is the only other option from the above if
{
    mapClass.GenerateCustomMap(64, 10, 8, 3, false);
}

请注意,我遗漏了BackgroudTiles的拼写错误,请根据需要进行纠正。