//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);
从这段代码中,我如何找到已注册两门课程的学生?我一直试图解决这个问题,我是一个新手,所以我再也找不到了。
非常感谢任何帮助!
提前致谢!
答案 0 :(得分: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
个实例共享一个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);
答案 1 :(得分:2)
您可以使用Linq:
list1.GroupBy(s => s.id).Where(g => g.Count() == 2);
您还应该考虑重做类抽象,以便Student
对象包含一系列课程。你现在的抽象是令人困惑的,因为Student
类的多个实例实际上代表同一个学生。
我还建议您查看object and collection initialization syntax,这将有助于清理此代码。
使用初始化语法的新抽象和使用,您的即时消息可能如下所示:
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个学生对象,可以指同一个学生但不同的课程 你如何定义同一个学生是在多少课程:你需要开始计算一个学生有一个具有相同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);
你有你的列表(每个学生),它将按ids分组,因此每个具有相同id的元素将“在一起”,Where
指的是你需要的条件,即s。 count指的是像“漂亮”一样的元素,主题为“BIS103”和“BIS101”,元素的数量为2,因此它符合Where(2 > 1)
标准
正如你所说的那样,你是一个新手我试着解释它,就像我从学校里记得那样。