2017-09-29 2 views
0

Je veux rejoindre 2 listes. Étudiants et personnes. Student et Person ont tous deux un identifiant et une variable de nom, plus Student a une autre variable appelée isStudying. Je veux joindre tous les étudiants à la personne avec la variable isStudying.Joindre 2 listes avec condition

enter image description here

var persons = new Person { id = 1, name = "John" }; 
var persons = new Person { id = 2, name = "Ace" }; 
var persons = new Person { id = 3, name = "Mike" }; 
var persons = new Person { id = 4, name = "Yob" }; 
var persons = new Person { id = 5, name = "Ken" }; 

var students = new Student { id = 2, name = "Ace", isStudying=true }; 
var students = new Student { id = 3, name = "Mike", isStudying = true }; 
var students = new Student { id = 5, name = "Ken", isStudying = true }; 

persons.Addrange(students.where(student.id.contain(persons.id))); 
+1

1- quelle langue? C# peut-être 2- utiliser l'héritage 3- déclarer correctement les variables –

+0

merci de répondre. 1. Oui c'est C#. 2. Les données proviennent de différentes tables. Mais seulement sélectionné ces valeurs à des fins d'affichage. La variable isStudying détermine si la case est cochée lors de l'affichage. – kent

+1

Si vous êtes d'accord pour utiliser des types anonymes, voici un seul doublon: 'persons.Select (p => new {p.id, p.name, students.Any (s => s.id == p.id && s.isStudying)}); '. Bien qu'il semble que vous pourriez simplement utiliser la classe 'Student':' persons.Select (p => new Student {id = p.id, nom = p.name, isStudying = students.Any (s => s.id) == p.id && s.isStudying)}); ' –

Répondre

1

Voici une solution complète mise en œuvre dans LINQ, l'héritage utilisé

class Person 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
} 

class Student : Person 
{ 
    public bool isStudying { get; set; } 
} 

void Main() 
{ 
    var person1 = new Person { id = 1, name = "John" }; 
    var person2 = new Person { id = 2, name = "Ace" }; 
    var person3 = new Person { id = 3, name = "Mike" }; 
    var person4 = new Person { id = 4, name = "Yob" }; 
    var person5 = new Person { id = 5, name = "Ken" }; 

    var persons = new List<Person> { person1, person2, person3, person4, person5 }; 

    var student1 = new Student { id = 2, name = "Ace", isStudying = true }; 
    var student2 = new Student { id = 3, name = "Mike", isStudying = true }; 
    var student3 = new Student { id = 5, name = "Ken", isStudying = true }; 

    var students = new List<Student> { student1, student2, student3 }; 

    var personsRes = persons.Where(y => students.Select(x => x.id).Contains(y.id)); 

    Console.WriteLine(personsRes); 
} 
0

Essayez ceci:

public class Person 
    { 
     public int id { get; set; } 
     public string name { get; set; } 
    } 

    public class Student 
    { 
     public int id { get; set; } 
     public string name { get; set; } 
     public bool isStudying { get; set; } 
    } 

    var persons = new List<Person> { new Person { id = 1, name = "John" }, 
     new Person { id = 2, name = "Ace" }, 
     new Person { id = 3, name = "Mike"}, 
     new Person { id = 4, name = "Yob" }, 
     new Person { id = 5, name = "Ken" } }; 

     var students = new List<Student> { new Student { id = 2, name = "Ace", isStudying = true }, 
     new Student { id = 3, name = "Mike", isStudying = true }, 
     new Student { id = 5, name = "Ken", isStudying = true } }; 

     var allPersons = (from p in persons 
          join s in students on new { first = p.id } equals new { first = s.id } into sjoin 
          from slj in sjoin.DefaultIfEmpty() 
          select new 
          { 
           id = p.id, 
           name = p.name, 
           isStudying = (slj != null ? (slj.isStudying ? "TRUE" : "FALSE") : string.Empty) 
          }).ToList(); 
0

Pour la référence des futurs lecteurs, une réponse simple que je fourni dans les commentaires en utilisant LINQ est:

Avec des types anonymes:

persons.Select(p => new { p.id, p.name, students.Any(s => s.id == p.id && s.isStudying) }); 

Utilisation d'une classe personnalisée (la classe Student peut effectivement être réutilisé):

persons.Select(p => new Student { id = p.id, name = p.name, isStudying = students.Any(s => s.id == p.id && s.isStudying) });