2010-10-11 89 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