Элементы списка зависят друг от друга - PullRequest
0 голосов
/ 25 февраля 2019

Каким-то образом элементы в моем списке (Maps = new List<CollisionTiles>[]) зависят друг от друга.Этот список содержит только объект о плитках столкновений в моей игре, поэтому, когда я хочу изменить свои плитки на карте на 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 голосов
/ 26 февраля 2019

Вы устанавливаете 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, пожалуйста, исправьте при необходимости.

0 голосов
/ 26 февраля 2019

Действительно трудно сказать из кода, который вы опубликовали, но на основании вашего описания вы можете скопировать «ссылку» на коллекцию, если вы намеревались скопировать саму коллекцию.

Например, скажем,чтобы получить список с именем a, и вы пытаетесь создать другой список с именем b, например:

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

То, что на самом деле делает приведенный выше код, делает a и b a "ссылка "на тот же список .

Другими словами, если вы тогда сделали что-то вроде этого:

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();

Надеюсь, это поможет.

...