anu*_*ith 3 c# search autosuggest
我正在编程一个程序来搜索列表中的名称,即使关键字不在名称前面我也需要找到它们(这就是我的意思是非前缀)
例如,如果我的列表是乐器,我在搜索文本框中键入"guit".
它应该找到名称"吉他,Guitarrón,原声吉他,低音吉他,......"
 
或类似Longdo Dictionary的搜索建议.
这是我简单而愚蠢的算法(这就是我所能做的)
    const int SEARCHROWLIMIT = 30;
    private string[] DoSearch(string Input, string[] ListToSearch)
    {
        List<string> FoundNames = new List<string>();
        int max = 0;
        bool over = false;
        for (int k = 0; !over; k++)
        {
            foreach (string item in ListToSearch)
            {
                max = (max > item.Length) ? max : item.Length;
                if (k > item.Length) continue;
                if (k >= max) { over = true; break; }
                if (!Input.Equals("Search")
                    && item.Substring(k, item.Length - k).StartsWith(Input, StringComparison.OrdinalIgnoreCase))
                {
                    bool exist = false;
                    int i = 0;
                    while (!exist && i < FoundNames.Count)
                    {
                        if (item.Equals(FoundNames[i]))
                        {
                            exist = true;
                            break;
                        }
                        i++;
                    }
                    if (!exist && FoundNames.Count < SEARCHROWLIMIT)
                        FoundNames.Add(item);
                    else if (FoundNames.Count >= SEARCHROWLIMIT) over = true;
                }
            }
        }
        return FoundNames.ToArray();
    }
我认为这个算法对于大量的名称来说太慢了,经过几次试错,我决定添加SEARCHROWLIMIT来打破操作.我也认为有一些现成的方法可以做到这一点.
另一个问题是我需要通过字符串,打击乐器等类别以及原始国家搜索乐器.因此,我需要按类型和国家/地区搜索过滤器.
我怎样才能做到这一点?
使用LINQ,您可以编写如下代码:
var resultSet = products
    // filter products by category
    .Where(product => product.Category == "strings")
    // filter products by origin
    .Where(product => product.Origin == "italy")
    // filter products whose name contains a word starting with "guit"
    .Where(product => (" " + product.Name).Contains(" guit"))
    // limit the result set to the first 30 matching products
    .Take(30);
如果您的产品组相当小,则可以使用LINQ-to-Objects.否则,您应该使用数据库并查看LINQ-to-SQL.