我列表(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);
}
答案 0 :(得分:1)
从发布的代码中很难说出来,但是根据您的描述,当您打算复制集合本身时,可能会将“引用”复制到集合中。
例如,假设有一个名为a
的列表,而您尝试创建另一个名为b
的列表,如下所示:
var a = new List<string>();
var b = a;
以上代码的实际作用是使a
和b
成为相同列表的“引用”。
换句话说,如果您随后执行了以下操作:
b.Add("item");
现在,两个名为a
和b
的“列表”中将包含相同的项目。那是因为它们实际上不是不同的列表,它们是带有两个“指针”的相同列表。
有两种不同的方法可以正确地在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
的任何修改也将更改原始List
。 BackgroundTiles
也是如此。
要解决此问题,请在将新的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
的拼写错误,请根据需要进行纠正。