C # list.remove выдает ошибку операции перечисления в цикле foreach - PullRequest
1 голос
/ 29 апреля 2019

Я рассмотрел несколько вопросов SO, связанных с моим, а также с поиском в Google, и мне не удалось найти решение, которое работает для меня.

Учитывая список файлов, я пытаюсь отбросить все файлы, не относящиеся к cs, по причинам. Я беру строковый массив, преобразую в список и перебираю список, удаляя все ненужные файлы, используя list.Remove ().

После первого удаления выдает ошибку

Collection was modified; enumeration operation might not execute

Код:

string[] files = null;
            try
            {
                files = System.IO.Directory.GetFiles(currentDir);

                //Converting to list, to use list.Remove rather than rewriting entire array at each delete
                var list = new List<string>(files);
                foreach (string readFile in list)
                {
                    if (Path.GetExtension(readFile) != ".cs") //|| Path.GetExtension(readFile) != ".dll")
                    {
                        //remove, as we don't currently care about non cs files.
                        list.Remove(readFile);
                    }
                }

                //Converting back to string array for use in the rest of the program
                files = list.ToArray();
            }

Я также пробовал RemoteAt (), который выдает ту же ошибку.

string[] files = null;
            try
            {
                files = System.IO.Directory.GetFiles(currentDir);

                //Converting to list, to use list.Remove rather than rewriting entire array at each delete
                var list = new List<string>(files);
                int i = 0;
                for(int i=0; i<list.Count();i++)
                {
                    if (Path.GetExtension(readFile) != ".cs") //|| Path.GetExtension(readFile) != ".dll")
                    {
                        //remove, as we don't currently care about non cs files.
                        list.RemoveAt(i);
                    }
                    i++;
                }

                //Converting back to string array for use in the rest of the program
                files = list.ToArray();
            }

Любые рекомендации по преодолению этой ошибки, так как в некоторых каталогах будет более 500 файлов, и я хочу максимально избегать перезаписи строкового массива.

Я прочитал следующие вопросы:

Как удалить элемент из списка в C #?

C # Коллекция ошибок была изменена; операция перечисления может не выполняться

Перечисления Foreach Loop C #

«List.Remove» в C # не удаляет элемент?

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.remove?view=netframework-4.8

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.removeat?view=netframework-4.8

Ответы [ 3 ]

1 голос
/ 29 апреля 2019

Вы можете использовать метод RemoveAll для List:

list.RemoveAll(readFile => Path.GetExtension(readFile) != ".cs");

Это удалит все, что соответствует вашему предикату, и вернет количество удаленных элементов.

1 голос
/ 29 апреля 2019

Вы также можете использовать цикл for в обратном порядке, чтобы удаленные записи не влияли на цикл.

for (int x = list.Count-1; x >= 0; x--)
{
  string readFile = list[x];
  // ...
  list.Remove(readFile);
}
1 голос
/ 29 апреля 2019

Если я изменю

foreach (string readFile in list)

на

foreach (string readFile in list.ToList())

, это будет работать.

Я предполагаю, что list.Remove изменяет исходный список и делает недействительнымперечисление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...