列表元素彼此依赖

问题描述 投票:0回答:2

不知何故,我列表中的元素(Maps = new List<CollisionTiles>[])彼此依赖。这个列表只包含一个关于我游戏中碰撞图块的对象,所以当我想在Map中将我的图块更改为Maps[Something]时,Maps也在改变。但是,如果MapsMaps.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);
}
c# xna monogame
2个回答
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();

我希望有所帮助。


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

请注意,我已经离开了qazxswpoi的拼写错误,请在必要时更正。

© www.soinside.com 2019 - 2024. All rights reserved.