簡體   English   中英

如何從此C#代碼中找出結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM