[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); но лично за мен по-добре мога да се ориентирам като чета кода кой списък какви елементи има.