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