【问题标题】:filter list <object> with list<string> and look for a match in c#使用 list<string> 过滤列表 <object> 并在 c# 中查找匹配项
【发布时间】:2015-07-01 22:09:12
【问题描述】:

我有一个清单和清单

我想从 dbCars 对象中获取 Car 列表,条件为 Name、Title、Comment 属性包含 target_terms 数组中的任何值 [请注意,我不是在尝试查找包含对象属性的数组,但我正在尝试相反的方法] 并为结果动态分配排名

我尝试了下面的代码 [它将检查数组是否包含任何属性]

 List<Car> dbCars;//Values from Db 
 List<string> target_terms=new List<string> {"diesel","mechanic"};
var ranked_result = (from carItem in dbContext.Cars                  
                     select new
                     {
                         carItem,
                         Rank =   target_terms.Contains(carItem.Title) ? 1 :
                                  target_terms.Contains(carItem.Name) ? 2 :                               
                                  target_terms.Contains(carItem.Comment) ? 3 :
                                 0
                     }).OrderBy(i => i.Rank);
 //exclude results with no match (rank=0 ) and get a Distinct set  of images
List<Car> _searchResult = (from item in ranked_result
                             where item.Rank != 0
                             select item.carItem).Distinct().ToList();

我如何编写相同的代码来执行相反的操作,即检查 Car 属性是否包含 target_terms 中的任何单词

例如,如果我正在搜索柴油并且我有 2 辆名称为“Swift Diesel car”“Alto Diesel car”的汽车,它应该返回 2 个结果 即我的属性标题或名称或评论包含单词“柴油”

【问题讨论】:

    标签: c# linq list


    【解决方案1】:

    你可以这样做,

    var _searchResult = dbCars.Cars.Where(carItem => target_terms.Any(x => carItem.Title.Contains(x) ||
                                                                           carItem.Name.Contains(x) ||
                                                                           carItem.Comment.Contains(x)));
    

    编辑:

    var _searchResult = dbCars.Cars.Where(carItem => target_terms.Any(x => carItem.Title.Contains(x) ||
                                                                           carItem.Name.Contains(x) ||
                                                                           carItem.Comment.Contains(x)))
                                   .Select(carItem => new
                                   {
                                       carItem,
                                       Rank = target_terms.Any(x => carItem.Title.Contains(x)) ? 1 :
                                              target_terms.Any(x => carItem.Name.Contains(x)) ? 2 :
                                              target_terms.Any(x => carItem.Comment.Contains(x)) ? 3 : 0
                                   })
                                   .OrderBy(carItem => carItem.Rank);
    

    希望这会有所帮助...

    【讨论】:

    • 我可以在这个查询的帮助下添加排名吗
    • 这种分配 Rank 的想法是有效的,但是我在将 List 转换回时遇到错误 Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.//排除结果,没有匹配 (rank=0 ) 并获得一组不同的图像 final_result = (from item in _searchResult where item.Rank != 0 select item.carItem).Distinct().ToList();
    • 该异常已解决。现在的问题是 Title、Name、Comment 可以为 NULL。所以执行给出了空引用异常。我们可以在这个 target_terms.Any(x => carItem.Title.Contains(x) 中处理它吗?
    • 可以处理,比如target_terms.Any(x =&gt; (carItem.Title != null &amp;&amp; carItem.Title.Contains(x))...
    【解决方案2】:

    我没试过,但应该这样做:

    var filteredCars = dbContext.Cars.Where(c => 
        target_terms.Any(tt => c.Title.Contains(tt)) ||
        target_terms.Any(tt => c.Name.Contains(tt)) ||
        target_terms.Any(tt => c.Comment.Contains(tt)));
    

    由于其中一个为真就足够了,您不必担心选择不同的值。

    【讨论】:

      【解决方案3】:

      如果您想查找在标题、名称或评论中有来自 target_terms 的任何单词的汽车,请使用.Where 查询:

      var result = dbContext.Cars.Where(c => 
          target_terms.Any(t => 
               c.Title.Contains(t)  ||
               c.Name.Contains(t))  ||
               c.Comment.Contains(t)));
      

      不要忘记.Contains 区分大小写;

      如果你只需要匹配一个特定的词,它非常相似:

      var match_word = "diesel";
      var result = dbContext.Cars.Where(c => 
          c.Title.Contains(match_word)  ||
          c.Name.Contains(match_word))  ||
          c.Comment.Contains(match_word)));
      

      在这种情况下,不清楚该词与您的 target_terms 列表有何关联。

      编辑:修复了查询是否包含而不是相等性检查。

      【讨论】:

      • 在您的查询中,您正在寻找与目标词完全匹配的内容。在 OP 的问题中,关键字可能只是列值的一部分。
      • @TolgaEvcimen,你是对的,我已经修复了查询。
      猜你喜欢
      • 1970-01-01
      • 2020-11-29
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多