过滤器列表<;对象>;列表<;字符串>;并在c#中查找匹配项

本文关键字:gt lt 列表 查找 字符串 对象 过滤器 并在 | 更新日期: 2023-09-27 18:00:34

我有一个列表&列出

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

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

 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();

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

例如,如果我正在搜索柴油车,并且我有两辆名为"Swift diesel car"Alto diesel car"的汽车,它应该返回2个结果即我的房产标题或名称或注释包含单词"diesel"

过滤器列表<;对象>;列表<;字符串>;并在c#中查找匹配项

,你可以做到这一点

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);

希望这能帮助。。。

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

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)));

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

如果您想查找在标题、名称或注释中包含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列表相关的。

编辑:修复了检查包含而非相等的查询。