Loading...
TeodorDimitrov89 avatar TeodorDimitrov89 264 Точки

Objects and Classes - Exercises -->04. Average Grades

Здравейте.

Имам няколко проблема с тази задача.

1.Не знам как да си прочета масива от double от класа ми Students.

2. Проблема ми е накрая не знам как да ги сортирам като използвам LINQ нещо не го схващам и ми отпечатва типа данни.

Може ли малко помощ .

Благодаря предварително.

Кода ми е : http://pastebin.com/kvj54au1

Тагове:
0
Fundamentals Module
Filkolev avatar Filkolev 4482 Точки
Best Answer

Виждам с четенето само два проблема. Единият е, че не знаеш какъв размера да декларираш масива. Това не е сложно, той е с дължина едно по-малко от масива, който получаваш при сплитването на входа, или

double[] grades = new double[student.Length - 1];

В цикъла също трябва да имаш предвид, че имаш отместване, понеже в стринговия масив на позиция 0 имаш име, а оценките започват от позиция 1. Т.е. това, което в стринговия масив е на позиция 1, в оценките трябва да отиде на позиция 0 и т.н.

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

Ето това: var s in students.Select(st => st.Name).OrderBy(gr => gr), прави следното: 

  • взима колекцията от студенти students
  • Select прави проекция, т.е. създава нова колекция от обекти, които имат само Name пропъртито на оригиналните студенти.
  • OrderBy сортира. gr е един обект от проектираната колекция. Понеже след Select-a взимаш само имената, които са стрингове, OrderBy работи върху колекция от стрингове. Т.е. gr е стринг, казвайки да се сортира gr => gr ти де факто казваш на тази колекция да се сортира според дефолтния компаратор или с прости думи все едно на масив от стрингове да викнеш Sort - по азбучен (лекцикографски) ред.

Вече вътре в тялото на цикъла работиш с колекция от стрингове. s.Where(stu => stu >= 5) ще опита да вземе всеки елемент на конкретна колекция от стрингове (имена) и да ги филтрира според условието, което подаваш: stu >= 5. Това не е валидно сравнение при стрингове.

Идеята при подобни заявки е да филтрираш, сортираш и проектираш оригиналната колекция. Последователността на действията зависи от това какво се опитваш да направиш, но откъм ефикасност най-логично би било първо да филтрираш, т.е. да избереш само тези елементи, които те интересуват.

Да речем искаш от някаква колекция студенти да вземеш тези със среден успех над 5. Може да кажеш:

students.Where(student => student.AverageGrade >= 5);

Тук боравиш с колекция от студенти, съответно student е обект тип Student. Прилагаш филтриране с Where, т.е. избираш само тези обекти, които отговарят на условието, а именно - средният успех да е поне 5.

След това ако искаш да подредиш останалите студенти (по-добре е след филтрацията, по-малка колекция се сортира по-бързо), може да направиш chain-инг на методите. Понеже всеки от тези методи връща колекция може да ги навържеш един след друг. Да приемем, че искаш да ги сортираш в низходящ ред по средна оценка:

students.Where(student => student.AverageGrade >= 5).OrderByDescending(student => student.AverageGrade);

Накрая, ако ти трябват само имената и нищо друго, може да направиш проекция със Select. Ако критериите за филтриране и сортиране също ти трябват накрая, може Select-a да е по-рано, но в този случай трябва да е накрая. Ако в началото селектираш от всички студенти само имената им, губиш достъп до всички останали техни свойства, и най-вече средните им оценки. В крайна сметка получаваш нещо такова:

students.Where(student => student.AverageGrade >= 5).OrderByDescending(student => student.AverageGrade).Select(student => student.Name);

Това нещо трябва да го запазиш в нова колекция, която може да форийчнеш и принтираш.

var studentsOrderedByAverageGrade = (целия горен израз)

Console.WriteLine(string.Join(Environment.NewLine, studentsOrderedByAverageGrade));

3
TeodorDimitrov89 avatar TeodorDimitrov89 264 Точки

Леле Благодаря за изчерпателния отговор.

LINQ заявките ми са доста трудни и трябва да им обърна повече внимание точно там ми е проблема при сортиране и като цяло 

Благодаря 

 

0
Majmunkata avatar Majmunkata 1 Точки

На мен ми дава 70/100 и не мога да си хвана бъга... Нещо при закръглянето е според мен, но не знам как

точно да го поправя -> http://pastebin.com/QmyjgT4M

0
traykova44 avatar traykova44 93 Точки

Majmunkata  можеш да го закръглиш ето така  

Console.WriteLine($"The project prize was {o:f2} lv.");

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