[英]How do I find out the result from this C# code
//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);
從此代碼中,我如何找出已報讀兩門課程的學生? 我一直在努力解決這個問題,我是新手,所以我再也無法掌握了。
任何幫助將不勝感激!
提前致謝!
這是一個相當簡單的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
實例共享一個ID,則它們實際上是同一學生。 如果發生這種情況,您可能需要重新考慮您的類結構。 我建議類似的東西:
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);
您可以為此使用Linq:
list1.GroupBy(s => s.id).Where(g => g.Count() == 2);
您還應該考慮重做您的類抽象,以便Student
對象保存課程列表。 您現在的抽象令人困惑,因為Student
類的多個實例實際上代表同一位學生。
我還建議您查看對象和集合初始化語法 ,這將大大幫助清理此代碼。
通過新的抽象和初始化語法的使用,您的實例可能類似於:
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門課程的學生。
您擁有的是10個Student對象,它們可以引用相同的學生但課程不同。
如何定義同一學生有多少門課程:您需要開始計算一個學生的學生對象具有相同的ID或名稱,以識別該學生是同一學生並且具有不同的課程屬性; 您可以為每個Student對象建立一個循環。
然后有一個“清單”:如果您還沒有看到名字,則將他添加到列表中並計算1門課程; 如果名稱不同,則將另一個名稱添加到列表中,並在該名稱上添加1條路線; 如果名稱已經在您的列表中,則將1門課程添加到要檢查的名稱中。 在這10名學生之后,您的清單將包括Andy 2,Katty 2,Aimy 2,Kody 2,Pretty 2; 那么您需要檢查清單,並查看是否有2門或更多門課程符合您的條件的每個元素。
進行編程時,請嘗試分離問題,查看所擁有的,所需要的,並盡可能地將每個步驟分開。 這些稱為算法。
您可以從如何理解開始,然后進入最佳代碼選項,例如賈斯汀·尼斯納(Justin Niessner)的最后答案(高級答案):
list1.GroupBy(s => s.id).Where(s => s.Count() > 1);
您有自己的列表(每個學生),它將按ID分組,因此具有相同ID的每個元素都將“在一起”, Where
您需要的條件,而s.count則指的是像主題為“ BIS103”和“ BIS101”的“ Pretty”一樣,元素的數量為2,因此它與Where(2 > 1)
條件匹配
正如您所說的,您是個新手,我記得在學校時就試圖解釋它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.