[Advanced C# Exam 19July2015] Нужда от разяснение относно Linq с Dictionary
Здравейте!
Въпросът ми е относно 4-та задача на изпита: Защо дадения Dictionary в решения вариант е с long, а не с int. По условие зададената популация в един град е до 2 000 000 000. След като я напрвих с int видях, че гърми в ламбдата:
//<Country>,<Town, Population>>
var populationData = new Dictionary<string,Dictionary<string,int>>();
//...
//Sort by Country population
var sortedPopulationData = populationData
.OrderByDescending(x => x.Value
.Sum(y => y.Value));
Виждам, че ламбдата сумира, но къде пази стойноста и какво точно се случва и защо гърми. Ще ви помоля да ми обясните защо трябва да използвам long, а не инт.
Да, разбирам и все пак не мога да разбера къде се пази това сумиране при положение, че аз му казвам сумираи тези неща които са int, а не запази там където е int. Мисълта ми е какво точно става когато му кажа сумираи всички int-ове.
Да речем, че имаш следните стейтмънти:
int a = 5;
int b = 2;
var c = a + b;
Какъв тип ще е с? Това компилаторът го решава, гледайки израза в дясната част, а той съдържа операции с променливи тип int, следователно целият израз е тип int. Какъвто е типът в дясната част, такъв е и на лявата част.
Компилаторът не е толкова умен, че да разбере дали съответната операция ще препълни типа по подразбиране, не му е работа самоволно да решава какви типове да определя за променливите. Това е задача на програмиста, който знае с какви ограничения работи и е в състояние да прецени в какъв тип променлива следва да се запази сборът.
Или по-конкретно при събирането на числата се случва нещо подобно:
int[] numbers = {1, 2000000000 };
int sum = 0; // събираме int-ове, така че подразбираме int като тип за сбора
foreach (int num in numbers) { sum += num; }
Понеже ползваш функционален подход, имплементацията просто е скрита от теб.
Това може да разбереш и от сигнатурата на метода. В случая ползваш:
Ахам сега ми стана ясно. Благодаря за помоща! :)