Loading...
mishomihaylov avatar mishomihaylov 67 Точки

[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, а не инт.

Тагове:
0
C# Advanced
moholovka avatar moholovka 169 Точки

Защото като сумираш няколко инта и минаваш над максималната стойност на инта и го превърташ, затова трябва да е лонг.

5
11/02/2016 12:17:16
mishomihaylov avatar mishomihaylov 67 Точки

Да, разбирам и все пак не мога да разбера къде се пази това сумиране при положение, че аз му казвам сумираи тези неща които са int, а не запази там където е int. Мисълта ми е какво точно става когато му кажа сумираи всички int-ове.

0
Filkolev avatar Filkolev 4482 Точки

Да речем, че имаш следните стейтмънти:

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; }

Понеже ползваш функционален подход, имплементацията просто е скрита от теб.

Това може да разбереш и от сигнатурата на метода. В случая ползваш:

public static int Sum(
	this IEnumerable<int> source
)
8
12/02/2016 21:07:43
mishomihaylov avatar mishomihaylov 67 Точки

Ахам сега ми стана ясно. Благодаря за помоща! :)

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.