繁体   English   中英

C#中的列表搜索

[英]list search in C#

我的C#网络应用程序中有一个列表。 此列表填充有从数据库获取的关键字。 现在,我想在列表中搜索,因为我有多个关键字搜索。

如果某人输入蓝色,那么所有与蓝色匹配的记录都将被提取到列表中。 现在,当他输入第二个关键字时,假设黄色,因此该列表应该被过滤,并且必须仅包含具有蓝色和黄色且与第三个和第四个关键字相同的记录

这是代码,我下一步要做什么?

public override List<ThumbNail> GetSearchResults(string search1, string path)
        {
  List<ThumbNail> mylist = new List<ThumbNail>();
       if (search1.Length - 1 == search1.LastIndexOf(","))
       search1 = search.Remove(search1.Length - 1);     
  List<string> search = new List<string>(search1.Split(','));
    for(int i=0; i <search1.Count;i++)

{
      OleDbCommand sqlcmdCommand1 = 
      new OleDbCommand("select Name,File,keyword from table1 where keyword like @searchone", mycon);

 sqlcmdCommand1.Parameters.AddWithValue("searchone", search[i]);
 sqlcmdCommand1.CommandType = CommandType.Text;
 OleDbDataReader sdaResult = sqlcmdCommand1.ExecuteReader();
 while (sdaResult.Read())
 {
  mytable thmb = new Thumbl();
  thmb.Name = sdaResult.GetString(0);
  thmbN.File = sdaResult.GetString(1);
  thmb.keyword = sdaResult.IsDBNull(3) ? "" : sdaResult.GetString(6);
  mylist.Add(thmb);
 }

} sdaResult.Close();

return mylist;
}

public class Thumbnail
{

        public int Id { get; set; }
        public string Name { get; set; }
        public string File { get; set; }
        public string keyword { get; set; }
        public string path { get; set; }
   }

用户输入第一个关键字时执行此操作。 现在,当用户键入第二个关键字时,所有与第一个关键字匹配的记录都在mylist中,因此必须在与第一个关键字和第二个关键字匹配的列表上进行搜索,然后返回结果。

The DB table look like this:

id   name   keyword  File  Fkey
1     a      yellow  c:/   20
2     a      blue    c:/   20
3     a      Pinky   c:/   20
4     b      orange  c:/   21
5     b      Redish  c:/   21

编辑 :更新您的问题后,我的答案不再适用,因为您的表结构与我预期的不同。 如果您的表格如下所示,我的答案将起作用:

id   name   keywords            File 
1     a     yellow blue pinky   c:/  
2     b     orange reddish      c:/  

老答案 :首先,您还需要选择关键字,以便进行进一步的过滤。

thmb.Keywords = sdaResult.GetString(someIndex);

然后,您可以使用LINQ创建列表的过滤版本。

var filtered = mylist.Where(thmb => thmb.Keywords.Contains(search2));

...,您可以在输入新的搜索关键字后立即进行进一步过滤。

var filtered = filtered.Where(thmb => thmb.Keywords.Contains(search3));

filteredIEnumerable 如果需要列表,请.ToList()应用.ToList()


新答案 :基本上,您需要对表结构进行以下操作:

  1. 从数据库中进行第二次提取,列出包含第二个关键字和

  2. 删除第二个列表中未包含的第一个列表中的所有列表项。 例如,如果您的包含第二个关键字的名称列表是一个名为narrowingSearch搜索的List<string> ,那么您可以

     var filteredList = mylist.Where(thmb => narrowingSearch.Contains(thmb.Name)); 

编辑 :现在,您已经有了一个通用的FK,您应该能够通过使用更高级的SQL来做到这一点,类似于:

SELECT name, file
  FROM table1
 WHERE keyword like @search0
   AND fk IN (SELECT fk FROM table1 WHERE keyword LIKE @search1)
   AND fk IN (SELECT fk FROM table1 WHERE keyword LIKE @search2)
   ...

您可以像这样在循环中构造此SQL:

string[] search = search1.Split(',');

OleDbCommand cmd = new OleDbCommand("SELECT name, file FROM table1 WHERE keyword LIKE @search0", mycon);
cmd.Parameters.AddWithValue("@search0", search[0]);

for (int i = 1; i < search.Length; i++) {
    cmd.CommandText += " AND fk IN (SELECT fk FROM table1 WHERE keyword LIKE @search" + i.ToString() + ")";
    cmd.Parameters.AddWithValue("@search" + i.ToString(), search[i]);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM