2010-10-11 86 views
0

我是LINQ的新手。我有一类这样的:LINQ-基于特定值排列对象列表

public class StudentResults 
{ 

    public int Id { get; set; } 

    public ResultsStatus StatusResult { get; set; } 

    public string Message { get; set; } 

    public StudentDetails Detail { get; set; } 

} 

有返回上面的类的List变量

我需要循环直通变量,并把学生分成两个不同的类的方法。 通过学生,基于ResultsStatus的失败学生。

这里是我试过,但它不工作

var studIds = from r in StudList 
group r by r.Id into GroupedData 
    select new 
    { 
    //what to put here 
    }; 
    foreach(var crs in studIds) 
    { 
    //what to put here to get all student names from the Detail property. 
    } 

有另一种方式?

+0

你是如何计划使用两个“班”的学生? – 2010-10-11 15:25:17

回答

3

就个人而言,我只想把它当作两个查询:

var passed = StudList.Where(student => student.StatusResult == ResultStatus.Passed); 
var failed = StudList.Where(student => student.StatusResult == ResultStatus.Failed); 

Console.WriteLine("Passed..."); 
foreach(var student in passed) 
    Console.WriteLine(student.Detail.Name); 

Console.WriteLine("Failed..."); 
foreach(var student in failed) 
    Console.WriteLine(student.Detail.Name); 
+0

嗨里德:是否有任何具体的理由来创建两个列表。 – TalentTuner 2010-10-11 15:30:31

+1

@saurabh:OP想要根据此属性分开收集。从使用的角度来看,将它作为两个IEnumerable 将使结果更容易使用。话虽如此,这并没有制作两个列表 - 它是从一个集合流入两个IEnumerable 实例的流式结果,但它们按照使用情况进行流式传输。 (我从来没有实际评估枚举,直到foreach ...) – 2010-10-11 15:32:15

+0

如果我可以根据ResultStatus组学生比我可以避免一个foreach循环 – TalentTuner 2010-10-11 15:34:36

2

听起来像是你想2所列出:一个失败,一个用于通过。

试试这个:

List<StudentResults> failed = StudList.Where(x=>x.ResultStatus=="Failed") 
             .ToList(); 

List<StudentResults> passed = StudList.Where(x=>x.ResultStatus=="Passed") 
             .ToList(); 
+0

是否有任何具体原因创建两个列表? – TalentTuner 2010-10-11 15:31:22

+0

@saurabh:两个列表是OP要求的。 “把学生分成两个不同的......”你读过这个问题了吗? – 2010-10-14 20:20:08

1

只需使用 “其中”。例如,为了让所有的“PassedStudents”:

var passedStudents = from student in StudentList 
        where student.StatusResult == ResultsStatus.PassedStudent 
        select student; 

foreach (var student in passedStudents) 
{ 
    Console.WriteLine("[{0}.] {1} passed.", student.Id, student.Detail.Name); 
} 

您还可以使用lambda表达式编写查询:

var passedStudents = 
    StudentList.Where(student => student.StatusResult == ResultsStatus.PassedStudent); 
+0

显然,与发布的其他解决方案一样,我会为“失败”的学生建议一个类似的查询。 – 2010-10-12 12:53:40