web-dev-qa-db-fra.com

linq où la liste contient n'importe quelle liste

Avec linq, comment puis-je récupérer une liste d'éléments dont la liste d'attributs correspond à une autre liste?

Prenons cet exemple simple et pseudo-code:

List<Genres> listofGenres = new List<Genre>() { "action", "comedy" });   
var movies = _db.Movies.Where(p => p.Genres.Any() in listofGenres);
104
Victor

On dirait que tu veux:

var movies = _db.Movies.Where(p => p.Genres.Intersect(listOfGenres).Any());
188
Jon Skeet

Vous pouvez utiliser une requête Contains pour cela:

var movies = _db.Movies.Where(p => p.Genres.Any(x => listOfGenres.Contains(x));
59
BrokenGlass

Si vous utilisez HashSet au lieu de List pour listofGenres, vous pouvez faire:

var genres = new HashSet<Genre>() { "action", "comedy" };   
var movies = _db.Movies.Where(p => genres.Overlaps(p.Genres));
4
Efraim Bart

Je suppose que c'est aussi possible comme ça?

var movies = _db.Movies.TakeWhile(p => p.Genres.Any(x => listOfGenres.Contains(x));

Est-ce que "TakeWhile" est pire que "Where" en termes de performance ou de clarté?

3
Trevor

Ou comme ça

class Movie
{
  public string FilmName { get; set; }
  public string Genre { get; set; }
}

...

var listofGenres = new List<string> { "action", "comedy" };

var Movies = new List<Movie> {new Movie {Genre="action", FilmName="Film1"},
                new Movie {Genre="comedy", FilmName="Film2"},
                new Movie {Genre="comedy", FilmName="Film3"},
                new Movie {Genre="tragedy", FilmName="Film4"}};

var movies = Movies.Join(listofGenres, x => x.Genre, y => y, (x, y) => x).ToList();
1
Viacheslav Avsenev