2010-10-11 9 views
0

Je suis nouveau sur LINQ. J'ai une classe comme ceci:LINQ- Commande d'une liste d'objets basée sur une valeur particulière

public class StudentResults 
{ 

    public int Id { get; set; } 

    public ResultsStatus StatusResult { get; set; } 

    public string Message { get; set; } 

    public StudentDetails Detail { get; set; } 

} 

Il existe une méthode qui retourne une liste de la classe ci-dessus à une variable

je dois itérer à travers cette variable et mettre les élèves en deux classes différentes. PassedStudents, FailedStudents basés sur ResultsStatus.

Voici ce que je l'ai essayé, mais cela ne fonctionne pas

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. 
    } 

Y at-il une autre façon?

+0

Comment comptez-vous utiliser les deux « classes » des élèves? –

Répondre

3

Personnellement, je voudrais juste traiter cela comme deux requêtes:

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

Salut Reed: Y at-il des raisons spécifiques pour créer deux listes. – TalentTuner

+1

@saurabh: L'OP voulait séparer la collection basée sur cette propriété. Du point de vue de l'utilisation, l'avoir comme deux IEnumerable rendra l'utilisation des résultats plus facile. Cela étant dit, ceci ne fait pas deux listes - c'est le streaming des résultats d'une seule collection dans deux instances IEnumerable , mais elles sont diffusées comme utilisées. (Je n'évalue jamais réellement les énumumer jusqu'à ce que le foreach ...) –

+0

Si je peux juste grouper l'étudiant basé sur ResultStatus que je peux éviter une boucle foreach – TalentTuner

2

On dirait que vous souhaitez 2 listes: une liste en cas d'échec, et un pour passé.

Essayez ceci:

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

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

Y a-t-il des raisons spécifiques pour créer deux listes? – TalentTuner

+0

@saurabh: deux listes sont ce que le PO a demandé. "mettre les étudiants en deux différents" ... Avez-vous lu la question? –

1

utiliser simplement "où". Par exemple, pour obtenir tous les « 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); 
} 

Vous pouvez également écrire la requête en utilisant des expressions lambda:

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

Évidemment, comme les autres solutions postées, je suggérerais une requête similaire pour les étudiants "Failed". –

Questions connexes