列表元素彼此依赖

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列表元素彼此依赖相关的知识,希望对你有一定的参考价值。

不知何故,我列表中的元素(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);
}
答案

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

例如,假设有一个名为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();

我希望有所帮助。

另一答案

您正在设置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的拼写错误,请在必要时更正。

以上是关于列表元素彼此依赖的主要内容,如果未能解决你的问题,请参考以下文章

无法从 ViewPager 中的另一个片段刷新/更新片段中的列表视图

Python代码阅读(第13篇):检测列表中的元素是否都一样

从另一个片段中的目录更新片段中的列表视图元素

从流输入中解析没有根元素的 XML 片段列表

在python中列出与彼此元素映射

Android片段重叠