【问题标题】:Linq to objects List in listLinq to objects List in list
【发布时间】:2010-11-30 08:17:55
【问题描述】:

我有一个电影列表

List<Movie> MovieList

我有一个选定类别的列表

List<string> SelCat

假设我想从匹配 2 个类别的电影列表中进行选择,如下面的 SQL 语句:

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

我可以像这样接近 linq:

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

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

顺便说一句:Movie.Categories 是一个字符串列表。并且 Movie.Categories 必须包含 SelCat 中的项目

如何使用 Linq to Objects 实现这一点?

【问题讨论】:

  • MovieList.Category = 'Action' AND MovieList.Category = 'Drama',你不是说 MovieList.Category = 'Action' OR MovieList.Category = 'Drama'
  • 不,MovieList.Categories 是一个列表
  • 您想查找所有动作片和剧情片吗?所以你不想要一部只有 DRAMA 的电影吗?
  • 是的。所有有动作和戏剧的电影。或 SelCat 字符串列表中的任何内容。

标签: c# linq linq-to-objects


【解决方案1】:
var q = from m in MovieList where SelCat.All(c => m.Categories.Contains(c))

非常接近您用英语描述问题时所说的:

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

【讨论】:

    【解决方案2】:
       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】:

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

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

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

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

      【讨论】:

      • 关闭,但我只有 132 条记录,而我应该有 183 条记录。感谢您的尝试!
      • +1 OP 给出了一个坏例子。 “动作”和“戏剧”使其他人成为硬编码,但本质上它们是SelCat中的元素。
      • @Rick Ratayczak:如果你能描述为什么这不是你想要的,那会很有帮助。
      • SelCat 在 List 中包含任意数量的字符串。 Movie.Categories 必须包含所有 SelCat 项目。还是谢谢你。
      • @Rick Ratayczak:这正是我的第一个查询所做的。
      【解决方案4】:
      var result = from movie in movieList
                   where selCat.All(selectedCategory => movie.Categories.Contains(selectedCategory))
                   select movie;
      

      记住.All().Any()之间的区别

      【讨论】:

      • 这将选择其类别是所选类别子集的电影。 OP想要达到相反的效果。
      • 谢谢,但我从该查询中得到 0 条记录。
      【解决方案5】:

      有点复杂:

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

      【讨论】:

        【解决方案6】:

        试试这个

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

        【讨论】:

        • 这也很接近,但是当我知道有183条记录时才返回132条记录。谢谢!
        【解决方案7】:

        只需做一个相交,然后是除外。 它有效,对不起,我不得不用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
        

        【讨论】:

        • 不幸的是,这不是正确的答案。我不知道是动作片还是剧情片还是喜剧片,但 Movie.Categories 必须包含 SelCat 中的项目。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多