6. Courses
Здравейте, затруднявам се със задача 6 от Упражненията за Речници.
Бъркам нещо в логиката и не знам къде, защо не ми се получава.
Може ли малко помощ по кода:
https://pastebin.com/qn2sJwvy
Благодаря
Здравейте, затруднявам се със задача 6 от Упражненията за Речници.
Бъркам нещо в логиката и не знам къде, защо не ми се получава.
Може ли малко помощ по кода:
https://pastebin.com/qn2sJwvy
Благодаря
Привет, това ти е решението коригирано 100/100 разгледай разликите (също така сплита ти не беше правилен, вместо Split(":") - трябва да е Split(" : "))...другото смятам, че ще го видиш сам :)
using System;
using System.Collections.Generic;
using System.Linq;
namespace _6._Courses
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, List<string>> registered = new Dictionary<string, List<string>>();
string courseAndStudent;
while ((courseAndStudent = Console.ReadLine()) != "end")
{
string[] courseSplitted = courseAndStudent.Split(" : ").ToArray();
string courseName = courseSplitted[0];
string studentName = courseSplitted[1];
if (!registered.ContainsKey(courseName))
{
registered.Add(courseName, new List<string>() { studentName });
}
else
{
registered[courseName].Add(studentName);
}
}
foreach (var course in registered.OrderByDescending(x => x.Value.Count()))
{
Console.WriteLine($"{course.Key}: {course.Value.Count()}");
foreach (var name in course.Value.OrderBy(x => x))
{
Console.WriteLine($"-- {name}");
}
}
}
}
}
Благодаря ви за помоща!
Мога ли да попитам няколко неща по кода?
Първо, ето този синтаксис не ми е мн ясен:
registered.Add(courseName, new List<string>() { studentName });
}
else
{
registered[courseName].Add(studentName);
}
Гледах лекцията за Речници няколко пъти , там решаваха задачите с ето такъв синтакси:
if (!histogram.ContainsKey(currCh))
{
//histogram.Add(currCh, 1);
histogram[currCh] = 1;
}
else
{
histogram[currCh]++;
}
За това и бях почнал така да го правя. Не разбирам защо сега изведнъж се промени?Казаха ни че това е краткия вариант с Add и може така да го правим. Може ли да обясните разликата, че се обърках?
Другият ми въпрос е защо foreach са вложени? Ако бяха един след друг нямаше ли да работи. Благодаря още веднъж за помоща.
if (!registered.ContainsKey(courseName))
{
registered.Add(courseName, new List<string>() { studentName });
}
else
{
registered[courseName].Add(studentName); (ако го има курса добавяме участник за него)
}
if (!registered.ContainsKey(courseName)) - проверяваме дали не съществува вече такъв курс, ако не създаваме в речника такъв курс (courseName) и инициализираме колекция от стрингове (new List<string>() ) в която до пазим хората, които са записани за съответният курс. По условие трябва ако няма такъв курс да го създадем и да добавим в колекцията си от хора ( new List<string>() ) човека който ни е подаден. Това може да стане
1. !registered.Add(courseName, new List<string>();
register[courseName].Add(studentName);
(в твоят код който беше можеш да видиш, че ти не инициализираше нова колекция (List<string>)), a имаше само една стрингова променлива в речника (в която няма как да пазиш хора повече от един => Dictionary<string, string> registered = new Dictionary<string, string>();)
2. Или по пократкият начин по който аз съм го написал - директно със създаването на листа(колекцията), вкарвам и един човек в нея.
registered.Add(courseName, new List<string>() { studentName }); => този синтаксис е също единтичен с този:
registered.Add(courseName, new List<string>()
{
studentName
});
накратко замества командата add => директно ги вкарвам в колекцията (още един пример => ако ми трябва да вкарам няколко имена в някакъв лист мога да го направя и по този начин new var temp = new List<string>() { studentName1, studentName2, studentName3 }; , вместо да казвам => temp.Add(studentName1), temp.Add(studentName2) ... тествай това парче код и ще разбереш.
Защо са вложени...защото трябва да се отпечата името на курса - това е едната итерация, всеки курс има записани участници...какво ще се получи ако имаме два отделни фора - първият ще печата имената на курсовете и ще ги нареди един след друг (което не е по условие), а втория ще отпечата имената на участниците (и пак едно след друго но вече след като са изброени всички курсове)... за да стане по условие - първо името на курса и всички участници в него ни трябва вложен фор - който от начало да върти през курса (първият фор) и след това да мине през всички участници в него (вторият вложен фор)...дебъгни го няколко пъти и смятам, че ще ти стане ясно..