[LISTS] - Exercise - 07-Count Numbers
Здравейте, колеги!
В едно от решенията на задачата за упражнение от List - Problem: Count Numbers (slide 19):
Read a list of integers in range [0…1000] and print them in ascending order along with their number of occurrences
Срещам следния проблем: В хода на изпълнението в ред 22 от следния код: http://pastebin.com/JjCeEvbA
при четенето на 2-я елемнт от списъка inputL, цикъла foreach ми дава следната грешка:
System.InvalidOperationException was unhandled
  HResult=-2146233079
  Message=Collection was modified; enumeration operation may not execute.
  Source=mscorlib
  StackTrace:
       at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
       at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
       at System.Collections.Generic.List`1.Enumerator.MoveNext()
       at _07_Count_Numbers.CountNumbers.Main(String[] args) in D:\...\16-Lecture-List_and_Matrics\07-Count Numbers\CountNumbers.cs:line 38
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 
Въпросът ми е: каква е причината цикъла foreach да дава грешка при четенето на втория елемент???
(P.S.: Задачата съм я решил по друг начин, въпросът ми не е свързан с намиране на решение!!!)
Благодаря Иван ( RoYaL ) за изчерпателния и полезен отговор!
Важно беше уточнението "Присвояването на една променлива от тип списък в друга променлива не предизвиква копиране на списъка", и че така указателите и на двете променливи ( tempL и inputL ) сочат към едно и също място в паметта!
Чрез изчерпателния отговор на Иван и с предложението на колегата ArmenPotourlyan от предходния коментар:
проблема се реши и най-важното осмислих същността на копирането/създаването на списъци, а предполагам е същото и с масивите.
Благодаря Ви отново колеги за отговорите!
Благословения!
Много полезна информация, благодарим на RoYaL и ArmenPotourlyan за изчерпателните отговори. Това е наистина нещо, което човек може да обърка, когато не е свикнал или е под стрес на изпита :D Като допълнение само, това, което аз правя за да съм най-сигурен че ми се добавят елементите на един списък в друг, е директно да ползвам .AddRange(иметонаоригиналниясписък).
Или за този случай:
List<int> tempL = new List<int>();
tempL.AddRange(inputL);
Прави абсолютно същото като List<int> tempL = new List<int>(inputL); но лично за мен по-добре мога да се ориентирам като чета кода кой списък какви елементи има.