繁体   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