我有一个WebItem类:
class WebItem
{
public string Name { get; set; }
public string Description { get; set; }
public string Keywords { get; set; }
}
用户输入一些搜索短语,程序应找到所有项目,其中存在搜索词组中的所有词组。 E.x.用户输入短语:“some text”。该程序应该找到项目,其中
用户可以输入不同长度的短语。怎么做?
答案 0 :(得分:3)
好吧,我不打算给你一个完整的解决方案,但听起来你需要:
All
方法将在这里为您提供帮助。您只需要弄清楚如何检查项目中单个字词的位置,然后使用All
将其应用于给定查询中的所有搜索字词。您可能希望更改WebItem
的结构。如果这些属性中的每一个都可以包含多个单词,那么您可能希望将它们分开...否则在匹配方面会很棘手。例如,如果用户键入“am”作为搜索词,可能您不希望它与“name”的描述匹配,但是做希望它与“我在这里”的描述。然后你就遇到了堵塞等问题......
(顺便说一句,如果你要分割你可以匹配的术语,你可以为每个HashSet<string>
创建一个WebItem
,只是为了匹配。)
Marc关于使用设计的第三方API 来做这类事情的观点很好,请注意。
答案 1 :(得分:0)
试试这个。
var lst = new List<WebItem>();
string searchString = "your text";
string[] searchArr = searchString.Split(" ".ToCharArray());
lst.Where((l) => searchArr.Count((s) => l.Name.Contains(s)) > 0
|| searchArr.Count((s) => l.Keywords.Contains(s)) > 0
|| searchArr.Count((s) => l.Description.Contains(s)) > 0);
答案 2 :(得分:0)
谢谢,Marc。
解决方案非常简单。
//term - search phrase
var terms = term.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
//searching list.
var searchList = some_data_list_from_somethere_where_we_are_searching.AsEnumerable();
foreach (var item in terms)
{
searchList = searchList.Where(q => q.Name.Contains(item) ||
q.Keywords.Contains(item) ||
q.Description.Contains(item));
}