2013-06-13 2 views
1
//10 objects will be defined here 
Students s1 = new Students{}; 
s1.id = 101; 
s1.name= "Andy"; 
s1.subject = "BIS101"; 
s1.score = 89; 

Students s2 = new Students{}; 
s2.id = 101; 
s2.name= "Andy"; 
s2.subject = "BIS102"; 
s2.score = 95; 

Students s3 = new Students{}; 
s3.id = 102; 
s3.name= "Katty"; 
s3.subject = "BIS103"; 
s3.score = 70; 

Students s4 = new Students{}; 
s4.id = 103; 
s4.name= "Aimy"; 
s4.subject = "BIS101"; 
s4.score = 70; 

Students s5 = new Students{}; 
s5.id = 104; 
s5.name= "Kody"; 
s5.subject = "BIS102"; 
s5.score = 60; 

Students s6 = new Students{}; 
s6.id = 104; 
s6.name= "Kody"; 
s6.subject = "BIS103"; 
s6.score = 70; 

Students s7 = new Students{}; 
s7.id = 103; 
s7.name= "Aimy"; 
s7.subject = "BIS103"; 
s7.score = 50; 

Students s8 = new Students{}; 
s8.id = 102; 
s8.name= "Kathy"; 
s8.subject = "BIS102"; 
s8.score = 40; 

Students s9 = new Students{}; 
s9.id = 105; 
s9.name= "Pretty"; 
s9.subject = "BIS103"; 
s9.score = 50; 

Students s10 = new Students{}; 
s10.id = 105; 
s10.name= "Pretty"; 
s10.subject = "BIS101"; 
s10.score = 60; 

     //create a new basket 
List<Students> list1 = new List<Students>(); 

//add those objects into basket 
list1.Add(s1);list1.Add(s2);list1.Add(s3);list1.Add(s4); 
list1.Add(s5);list1.Add(s6);list1.Add(s7);list1.Add(s8); 
list1.Add(s9);list1.Add(s10); 

От этого кода, как узнать, кто участвовал в двух курсах? Я пытаюсь разобраться в этом, и я новичок, так что я не мог получить дальше.Как я могу узнать из этого кода C#

Любая помощь будет очень признательна!

Заранее благодарен!

+0

Если вы написали это самостоятельно, вы должны знать, что используя циклы и сравнивая s.id со всеми остальными, вы можете узнать, что он зарегистрирован более чем на 1 курс. – mike27015

+2

, вы должны иметь каждого ученика со списком «Субъектов», каждый студент в настоящее время зарегистрировался на одного субъекта, с возможностью другого ученика, имеющего один и тот же идентификатор. – Sayse

+2

. Шов ответов, который следует сосредоточить на linq (что является хорошим и легким способом делать такие вещи). Но я бы рекомендовал попробовать сделать это «длинной рукой» (с использованием петель и т. Д.), Чтобы лучше познакомиться с C#/programming вообще (если вы на самом деле новичок). – Cemafor

ответ

2

Вот довольно простой LINQ запрос, чтобы найти то, что вы хотите:

list1.GroupBy(s => s.id).Where(s => s.Count() == 2); 

Или вы могли бы получить там зацикливание:

var dict = new Dictionary<int, int>(); 
var matches = new List<int>(); 

foreach(var s in list1) 
{ 
    if(dict.ContainsKey(s.id)) dict[s.id] = dict[s.id] + 1; 
    else dict.Add(s.id, 1); 
} 

foreach(var kvp in dict) 
{ 
    if(kvp.Value == 2) matches.Add(kvp.Key); 
} 

Имейте в виду, однако, что если два Student случаях делиться ИД, они действительно одни и те же ученики. Если это произойдет, вы можете подумать о своей структуре класса. Я хотел бы предложить что-то вроде:

public class Course 
{ 
    public string Name { get; set; } 
    public int Score { get; set; } 
} 

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Course> Courses { get; set; } 
} 

Это означает, что для любого студента, вы бы просто:

list1.Where(s => s.Courses.Length == 2); 
+0

он сказал за 2 курса ... не более одного –

+0

@im_a_noob - Исправлено. –

+0

Эй! У меня есть класс, написанный следующим образом: общественный класс Учащиеся \t { \t \t общественное название строки; \t \t public int id; \t \t общественная тема струны; \t \t общественный двойной балл; \t \t \t} // конец класса У меня возникли ошибки при запуске, он говорит, что не содержит определения GroupBy! – user2042721

2

Вы можете использовать Linq для этого:

list1.GroupBy(s => s.id).Where(g => g.Count() == 2); 

Вы должны также рассмотрите повторную абстракцию вашего класса, чтобы объект Student содержал список курсов. Ваша абстракция прямо сейчас запутанна, так как несколько экземпляров класса Student фактически представляют одного и того же ученика.

Я также рекомендую посмотреть на object and collection initialization syntax, что поможет убрать этот код.

С новой абстракцией и использованием синтаксиса инициализации, ваш instantation может выглядеть следующим образом:

var student1 = new Student { ID = 10, Courses = new List<Course> { c1, c2 } }; 
var students = new List<Student> { student1, student2 }; 

И тогда ваш запрос Linq будет:

students.Where(s => s.Courses.Count() == 2); 
2

У вас есть 2 способа добраться до ответ:

Прежде всего, вы должны понимать, как сделать то, что вам нужно

Вам необходимо знать студентов, по крайней мере, 2 курса.
У вас есть 10 объектов-учеников, которые могут ссылаться на одного и того же студента, но на другой курс.
Как вы определяете одного и того же ученика в том, сколько курсов: вам нужно начать считать, что у одного ученика есть объект-ученик с тем же идентификатором или именем, чтобы определить, что он является тем же учеником и имеет другое свойство курса; вы можете сделать цикл для каждого из объектов Student.

Затем введите «контрольный список»: если вы еще не видели имя, то добавьте его в список и подсчитайте 1 курс; если имя отличается, то вы добавляете другое имя в список и добавляете 1 курс к этому имени; если имя уже находится в вашем списке, то вы добавляете 1 курс к имени, которое вы проверяете. После 10 студентов ваш контрольный список будет иметь Andy 2, Katty 2, Aimy 2, Kody 2, Pretty 2; то вам нужно проверить свой контрольный список и посмотреть на каждый элемент, если он имеет 2 или более курсов в соответствии с вашими критериями.

При программировании попробуйте отделить свою проблему, посмотреть, что у вас есть, что вам нужно, и попытаться отделить каждый шаг между вами как можно больше; они называются алгоритмами.

Вы можете начать с тем, как вы понимаете, а затем перейти к лучшим вариантам кода, как, последние ответы, как (продвинутому ответ) Джастин Niessner в:

list1.GroupBy(s => s.id).Where(s => s.Count() > 1); 

У Вас есть свой список (каждый студент), то это будет сгруппированы по идентификаторам, поэтому каждый элемент, имеющий один и тот же идентификатор, будет «вместе», Where относится к условию того, что вам нужно, s.count относится к элементам, которые вместе похожи на «Pretty», который имеет объект «BIS103», и «BIS101», количество элементов равно 2, поэтому оно соответствует критериям Where(2 > 1)

Как вы сказали вы были новичком, я пытался объяснить это, как я помню из школы.

+0

Спасибо Micheal !! Я беру этот C# в этом семестре! Итак, это только начало! – user2042721

Смежные вопросы