Linq to objects列表中的列表

时间:2010-11-30 08:17:56

标签: c# linq linq-to-objects

我有一个电影列表

List<Movie> MovieList

我有一个选定类别的列表

List<string> SelCat

并说我想从电影列表中选择它匹配2个类别,如下面的SQL语句:

SELECT * FROM MovieList WHERE MovieList.Category = 'Action' AND MovieList.Category = 'Drama'

我可以像linq那样接近linq:

var q = (from b in MovieList where b.Categories.Any(p=> SelCat.Contains(p)) select b);

但它的行为类似于OR查询,而不是AND。我希望它能够选择所有具有动作和戏剧类别的电影。

BTW: Movie.Categories是一个字符串列表。 AND Movie.Categories必须包含SelCat中的项目

如何使用Linq to Objects实现此目的?

7 个答案:

答案 0 :(得分:9)

var q = from m in MovieList where SelCat.All(c => m.Categories.Contains(c))

非常接近你用英语描述问题的内容:

选择电影类别包含SelCat中所有类别的电影。

答案 1 :(得分:1)

如果您希望电影与所有有趣的类别相匹配(即SelCat中的所有类别都出现在movie.Categories中),您可以这样做:

MovieList.Where(movie => !SelCat.Except(movie.Categories).Any()); 

另一方面,如果您希望电影与所选类别的至少 2匹配:

MovieList.Where(movie => SelCat.Intersect(movie.Categories).Count() >= 2); 

答案 2 :(得分:1)

   var SelectedCategories = List<string>();//list of selected categories

from movie in MovieList
join selCat in Categories.Where(SelectedCategories.Contains(selCat.Category)
on movie.category equals selCat.category
select movie

答案 3 :(得分:0)

只做一个交叉,然后是除外。 它很有效,对不起,我不得不用vb写出来。

Dim categories As New List(Of String)
Dim selected As New List(Of String)

        categories.Add("ali")
        categories.Add("ali2")
        categories.Add("ali3")
        categories.Add("ali4")

        selected.Add("ali2")
        selected.Add("ali4")


        Dim common = categories.Intersect(selected)

        If common.Except(selected).Count = 0 Then
            'true
        Else
            'false
        End If

答案 4 :(得分:0)

有点复杂:

var moviesInSelCat = MovieList.Where(m => SelCat.All(sc => m.Category.Any(c => c == sc)));

答案 5 :(得分:0)

var result = from movie in movieList
             where selCat.All(selectedCategory => movie.Categories.Contains(selectedCategory))
             select movie;

请记住.All().Any()

之间的区别

答案 6 :(得分:0)

试试这个

var matches = MovieList.Where(m => SelCat.Except(
    m.Categories.Intersect(SelCat)).Count() == 0);