dolfijn3000 Ответов: 1

C# list.remove делает странные вещи


Здравствуйте, я делаю текстовый симулятор hungergames на c#.
В моем коде у меня есть список со всеми игроками и их статистикой.
этот список состоит из класса под названием Player с переменными i nit,такими как name, kills и alive bool, чтобы проверить, жив ли игрок.

иногда в моем коде мне нужно выбрать случайного игрока, который жив. проблема с этим заключалась в том, что потребовалось слишком много времени, чтобы получить случайного игрока, потому что на поздних стадиях игры njot manyy people, где живые и случайный генератор всегда выбирали людей, которые мертвы, и я не могу их использовать.

поэтому я решил добавить второй список игроков под названием AlivePlayers. это то же самое, что и обычный список игроков onlt в этом списке я могу удалить игроков из lsit, когда они мертвы. я не могу сделать это в списке игроков, потому что мне нужно сохранить статистику от игроков.

поэтому, решив эту проблему, я начал писать код для фактического удаления игрока из списка. и вот тут-то все и пошло наперекосяк.

сначала я начал с написания кода для удаления игроков из списка alivePlayers. я запустил свою программу и проследил за значениями списков в окне просмотра. затем я увидел, что в тот момент, когда я запустил метод удаления списка, элементы удаляются из списка alivePlayers, но также и из списка игроков. сначала я подумал, что проблемы были где-то еще в моем коде, поэтому я прокомментировал удаленную часть и попробовал еще раз. но ничего не знаю Гоц удален, так почему же удалить методом удаляет из 2 списков ?

вот та часть кода, которая это делает:
if(action.Element("Action").Element("lethalto").Value != "none")
     {
         string rawString = action.Element("Action").Element("lethalto").Value;
         string[] playersToKill = rawString.Split('-');

         foreach(string player in playersToKill)
         {
             string playerIdString = player.Replace('p', ' ');
             int playerId = Int32.Parse(playerIdString);
             SurvivalGames.alivePlayers.Remove(affectedPlayers[playerId - 1]);

         }
     }

не фокусируйтесь на rawString и playersToKill. мой код написан так, что его можно настроить с помощью xml. эти переменные предназначены только для получения индексов игроков, которые должны быть удалены. эти 2 работают нормально, я уже проверил их.

affectedPlayers-это список игроков, которые затронуты. в этом случае я хочу удалить затронутых игроков из списка alivePlayers. playerId - это индекс игрока из списка затронутых игроков, который нам нужно удалить. я вычитаю 1, Чтобы не получить ошибку за пределами границ.

Итак, кто-то знает, почему метод remove() удален из обоих списков, а не только из alivePlayers ?

ps: извините за мой плохой английский, это не мой основной язык. и не стесняйтесь задавать вопросы, если вы чего-то не понимаете.

Что я уже пробовал:

поискав в google, но я не нашел ничего, связанного с моей проблемой.

1 Ответов

Рейтинг:
10

Richard Deeming

Основываясь на вашем описании, у вас есть две переменные, указывающие на один и тот же экземпляр List<T> Любые изменения, внесенные в этот экземпляр, очевидно, будут видны независимо от того, какую переменную вы используете для доступа к нему .

List<int> x = new List<int>();
List<int> y = x; // Points to the same instance.

x.Add(42);

Console.WriteLine(x.Length); // Output: 1
Console.WriteLine(y.Length); // Output: 1

y.Remove(42);

Console.WriteLine(x.Length); // Output: 0
Console.WriteLine(y.Length); // Output: 0

То, что вам нужно, - это отдельный экземпляр List<T>.
NB: Если элемент должен быть в обоих списках, то вам нужно будет добавить его в оба списка.
List<int> x = new List<int>();
List<int> y = new List<int>(); // Two separate instances.

x.Add(42);
Console.WriteLine(x.Length); // Output: 1
Console.WriteLine(y.Length); // Output: 0

y.Add(42);
Console.WriteLine(x.Length); // Output: 1
Console.WriteLine(y.Length); // Output: 1

y.Remove(42);
Console.WriteLine(x.Length); // Output: 1
Console.WriteLine(y.Length); // Output: 0


BillWoodruff

+5