如何从这个C#代码中找出结果

时间:2013-06-13 15:21:16

标签: c#

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

从这段代码中,我如何找到已注册两门课程的学生?我一直试图解决这个问题,我是一个新手,所以我再也找不到了。

非常感谢任何帮助!

提前致谢!

3 个答案:

答案 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)标准

正如你所说的那样,你是一个新手我试着解释它,就像我从学校里记得那样。