1
//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);

从这段代码中,我如何找出注册了两门课程的学生?我一直在尝试解决这个问题,我是新手,所以我无法再进一步了。

任何帮助将不胜感激!

提前致谢!

4

3 回答 3

2

你有两种方法可以得到答案:

首先,您必须了解如何做您需要的事情

您需要了解至少有 2 门课程的学生。
你所拥有的是 10 个学生对象,它们可以引用同一个学生但不同的课程。
如何定义同一个学生取决于有多少门课程:您需要开始计算单个学生有一个具有相同 ID 或名称的学生对象,以识别它是同一个学生并具有不同的课程属性;您可以为每个学生对象创建一个循环。

然后有一个“清单”:如果你还没有看到这个名字,那么你将他添加到列表中并计算 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”,元素的数量是2,所以它符合Where(2 > 1)条件

正如你所说,你是一个新手,我试图解释它,因为我记得在学校里。

于 2013-06-13T15:44:09.163 回答
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);
于 2013-06-13T15:24:27.100 回答
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);
于 2013-06-13T15:25:38.947 回答