在列表中搜索并使用C#返回包含特定搜索短语的项目

时间:2013-01-17 07:45:19

标签: c# .net

我有一个WebItem类:

class WebItem
{
   public string Name { get; set; }
   public string Description { get; set; }
   public string Keywords { get; set; }
}

用户输入一些搜索短语,程序应找到所有项目,其中存在搜索词组中的所有词组。 E.x.用户输入短语:“some text”。该程序应该找到项目,其中

  • (名称包含“some”,描述包含“text”)或
  • (名称包含“text”,描述包含“some”)或
  • (名称包含“some”,关键字包含“text”)或
  • (名称包含“text”,关键字包含“some”)或
  • (说明中包含“some”,关键字包含“text”)或
  • (说明包含“text”,关键字包含“some”)或
  • (名称包含“text”,名称包含“some”)或
  • (描述包含“text”,描述包含“some”)或
  • (关键字包含“text”,关键字包含“some”)

用户可以输入不同长度的短语。怎么做?

3 个答案:

答案 0 :(得分:3)

好吧,我不打算给你一个完整的解决方案,但听起来你需要:

  • 将用户的输入分解为单词
  • 检查所有单词是否以某种形式包含在项目中。 LINQ 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));
 }