不知何故,我列表中的元素(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);
}
从您发布的代码中很难说,但根据您的描述,当您打算复制集合本身时,您可能会将“引用”复制到集合中。
例如,假设有一个名为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();
我希望有所帮助。
您正在设置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
请注意,我已经离开了qazxswpoi的拼写错误,请在必要时更正。