2013-03-11 5 views
1

Dire que j'ai une collection d'objets personne -LINQ déterminer si une propriété sur un objet dans une collection existe dans une autre collection

public class Person 
{ 
    public string Firstname { get; set; } 
    public string Surname { get; set; } 
} 

Maintenant que j'ai une autre collection, tenant les noms des familles Je l'ai invité à ma fête -

var guestlist = new List<string> {"Stark", "Wayne"}; 

Comment puis-je utiliser LINQ (à base lamba de préférence, mais cela n'a pas d'importance trop) à tirer seulement des membres de la famille Stark ou Wayne? c'est à dire. Je veux finir avec une autre (troisième) collection, pas seulement une indication que ma première collection contient un membre de la famille Wayne ou Stark.

Répondre

3

Essayez ceci:

var invited = persons.Where(p => guestlist.Contains(p.Surname)); 
1

Je voudrais essayer ceci:

var peopleList = GetPeopleList(); 
var guestList = new List<string> {"Stark", "Wayne"}; 
var matchList = peopleList.Where(o => guestList.Contains(o)); 
1
var result = people.Where(x => guestlist.Contains(x.Surname)); 
2

Cette opération, sur le plan conceptuel, est une jointure. Il s'agit de faire correspondre des objets qui "appartiennent" ensemble à partir de deux ensembles différents.

var query = from person in people 
    join name in guestlist 
    on person.Surname equals name 
    select person; 

Notez que toutes les autres solutions qui impliquent l'utilisation Contains sur la liste des noms pour chaque élément dans la liste des personnes travailleront lorsque la taille des deux collections sont petites, mais la solution n'échelle pas bien du tout pour les grandes collections que vous êtes obligé de faire une recherche linéaire pour chaque article. Une jointure, lorsqu'elle est implémentée correctement (ce que fait LINQ) placera la liste des invités dans une collection qui peut être beaucoup plus efficacement recherchée.

Questions connexes