73 votes

LINQ: Sélectionnez où l'objet ne contient pas d'éléments de la liste

Je me bats avec la syntaxe LINQ ici ... j'ai pensé la jeter ici. Je ne trouve pas exactement ce que je cherche ailleurs.

OK, dis que j'ai ceci:

 public class Bar
{
   public int BarId { get; set; }
}

public class Foo
{
   public List<Bar> BarList { get; set; }
}

List<Foo> fooBunch = GetABunchOfFoos(); //let's just assume I'm getting more than one
List<Foo> fooSelect = new List<Foo>;
List<Bar> filterBars = GetAFewBars(); //assume I'm getting like 2 or 3

fooSelect = (from f in fooBunch
             where !(from b in f.BarList select b.BarId).Contains(ITEM FROM filterBars.BarId)
             select f).ToList();
 

Donc, je veux utiliser LINQ pour filtrer ma liste d’objets en fonction d’objets d’une autre liste. J'espère que cela a du sens. Je pense que je suis juste perdu sur la portion Contains ... Je ne sais pas comment écrire ça.

119voto

Thebigcheeze Points 1384

En général, vous recherchez l'extension "Except".

 var rejectStatus = GenerateRejectStatuses();
var fullList = GenerateFullList();
var rejectList = fullList.Where(i => rejectStatus.Contains(i.Status));
var filteredList = fullList.Except(rejectList);
 

Dans cet exemple, GenerateRegectStatuses () devrait être la liste des statuts que vous souhaitez rejeter (ou plus concrètement, sur la base de votre exemple, un List<int> d'ID).

71voto

hunter Points 33850

vider cela dans une collection plus spécifique de seulement les identifiants que vous ne voulez pas

 var notTheseBarIds = filterBars.Select(fb => fb.BarId);
 

alors essayez ceci:

 fooSelect = (from f in fooBunch
             where !notTheseBarIds.Contains(f.BarId)
             select f).ToList();
 

ou ca:

 fooSelect = fooBunch.Where(f => !notTheseBarIds.Contains(f.BarId)).ToList();
 

5voto

Tony The Lion Points 28208

Je n'ai pas essayé cela, donc je ne garantis rien, cependant

 foreach Bar f in filterBars
{
     search(f)
}
Foo search(Bar b)
{
    fooSelect = (from f in fooBunch
                 where !(from b in f.BarList select b.BarId).Contains(b.ID)
                 select f).ToList();

    return fooSelect;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X