Я не думаю, что я изменяю эту коллекцию - PullRequest
1 голос
/ 31 января 2012

Код:

    List<Item> Contents = ObjectHandler.player.Contents.ToList<Item>() //Was HashTable
    List<int> IDS = new List<int>(); //Holds Item IDs for later counting
    foreach (Item I in Contents) 
    {
        IDS.Add(I.ID); // Add ID to IDS
    }
    List<Item> newContents = Contents;
    foreach (Item I in Contents)
    {
        if (IDS.Contains(I.ID)) //Check if the ID has already been used in Contents
        {
            newContents.Remove(I); //Remove it
        }
    }
    Contents = newContents;

Этот фрагмент кода должен подготовить список идентификаторов для последующего подсчета, а также удалить дубликаты из списка элементов. Однако, как только элемент присутствует в Contents , я получаю исключение InvalidOperationException . Я совершенно уверен, что я не изменяю содержимое, через которое проходит foreach , таким образом, моя путаница. Может ли кто-нибудь объяснить это мне? спасибо.

Ответы [ 3 ]

7 голосов
/ 31 января 2012
newContents = Contents;

Теперь у вас есть две переменные, указывающие на одну и ту же коллекцию.

Вы, вероятно, хотите скопировать коллекцию, написав new List<Item>(Contents).

0 голосов
/ 31 января 2012

Хотя @SLaks указывает на хороший способ скопировать список и избегать того, чтобы два объекта указывали на одно и то же место, в первую очередь нет необходимости в двух списках.Для цикла (а не foreach) и обратного отсчета вы можете удалить элементы из исходного списка без каких-либо претензий.

Что-то в соответствии с приведенным ниже текстом должно работать:

0 голосов
/ 31 января 2012
var Contents = ObjectHandler.player.Contents.ToList<Item>();
var IDs = new HashSet<int>();
var filtered = Contents.Where( i =>
  {
      bool result = !IDs.Contains(i.ID);
      IDs.Add(i.ID);
      return result;
  }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...