首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >针对列表的多个搜索关键字

针对列表的多个搜索关键字
EN

Stack Overflow用户
提问于 2014-06-02 23:49:42
回答 2查看 106关注 0票数 1

现在已经有几天了,试图找出最有效的方法来搜索一个列表,列表中有数千个没有特定顺序的多个关键字。我在其他屏幕上实现了简单的搜索,但是这个有点棘手。让我解释一下。

所以让我们说我的清单如下所示

  1. 武术
    • 死亡游戏
    • 叶问
    • 威龙猛探

  1. 喜剧
    • 骑着
    • 警察学院
    • 锚人
    • 愤怒管理

  1. 动作
    • 血与骨
    • 《黑客帝国》
    • 美国船长
    • 终结者

如果我在搜索框中输入关键词"man",我希望看到3次点击,这是很容易完成的。然而,如果我键入部分关键字,如" ma“或”ma a“,我希望只看到”愤怒管理“。如果有一个以上的命中,那么我应该能够缩小它通过键入更多的词或简单地完成我的关键字,我在搜索框。

现在,我有了一些实现,但由于正在执行的迭代次数,我对此并不太满意。我担心,当我们有更多的数据,这个搜索将无法有效地执行,将是缓慢的。

代码语言:javascript
复制
public List<ValidAndCompletedModel> Filter(List<string> searchTerms)
{
    var validAndCompleted = new List<ValidAndCompletedModel>();

    foreach (var searchTerm in searchTerms)
    {
        var containingList = ValidAndCompleted.Where(d => ListsContainsSimilarEntry(searchTerm, d.EnglishTranslationTerms)).ToList();
        containingList = containingList.Distinct().ToList();
        validAndCompleted.AddRange(containingList.Where(d => ListsStartsWithSimilarEntry(searchTerm, d.EnglishTranslationTerms)).ToList());
    }
    validAndCompleted = validAndCompleted.Distinct().ToList();


    return validAndCompleted;
}

private bool ListsStartsWithSimilarEntry(string searchTerm, IEnumerable<string> searchList)
        {
            var available = searchList.Any(sl => sl.StartsWith(searchTerm));
            return available;
        }
private bool ListsContainsSimilarEntry(string searchTerm, IEnumerable<string> searchList)
            {
                var available = searchList.Any(sl => sl.Contains(searchTerm));
                return available;
            }

非常感谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2014-06-03 00:32:44

除非您的列表中有数以百万计的项目,否则性能不太可能成为问题。在尝试优化之前,您应该始终衡量实际使用性能。

在任何情况下,代码都可以简化如下:

代码语言:javascript
复制
public List<ValidAndCompletedModel> Filter(List<string> searchTerms)
{
    return (
        from searchTerm in searchTerms
        from d in ValidAndCompleted
        where d.EnglishTranslationTerms.Any(sl => sl.Contains(searchTerm))
        where d.EnglishTranslationTerms.Any(sl => sl.StartsWith(searchTerm))
        select d)
            .Distinct()
            .ToList();
}

这似乎不算太糟。唯一突出的是,您只返回“包含”和“以”翻译术语开头的项,但这意味着您只返回“以”开头的项,而忽略了任何“包含”项。这可能需要重新考虑。

现在,您可以进一步简化代码,如下所示:

代码语言:javascript
复制
public List<ValidAndCompletedModel> Filter(List<string> searchTerms)
{
    return (
        from searchTerm in searchTerms
        from d in ValidAndCompleted
        from sl in d.EnglishTranslationTerms
        where sl.StartsWith(searchTerm)
        select d)
            .Distinct()
            .ToList();
}

或者,通过这样做,可以完全避免.Distinct()调用(假设ValidAndCompleted列表中没有重复调用):

代码语言:javascript
复制
public List<ValidAndCompletedModel> Filter2(List<string> searchTerms)
{
    return ValidAndCompleted
        .Where(d => (
            from searchTerm in searchTerms
            from sl in d.EnglishTranslationTerms
            where sl.StartsWith(searchTerm)
            select d).Any())
        .ToList();
}
票数 0
EN

Stack Overflow用户

发布于 2014-06-03 00:44:15

使用您的电影和类别的例子。假设我们有这样一门课:

代码语言:javascript
复制
public class Category
{
    public string Name {get; set;}
    public List<string> Films {get; set;}
}

我们的电影是这样的:

代码语言:javascript
复制
var filmCategories = new List<Category>
{
new Category { Name = "Martial Arts", Films = new List<string>
        { "Game Of Death", "IP Man", "The Protector" }},            
    new Category { Name = "Comedy", Films = new List<string>
        { "Ride Along", "Police Academy", "Anchorman", "Anger Management" }},           
    new Category { Name = "Action", Films = new List<string>
        { "Blood And Bone", "The Matrix", "Captain America", "The Terminator" }}
};  

我们的搜索术语如下:

代码语言:javascript
复制
var searchTerm = "g d";
var searchTerms = searchTerm.ToLower().Split(' ');

你可以在这样的一张照片中得到你的搜索结果:

代码语言:javascript
复制
var results = filmCategories
    .SelectMany(category => category.Films)
    .Where(film => 
        searchTerms.All(term =>
            film.ToLower().Split(' ')
            .Any(word =>            
                word.StartsWith(term))));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24005036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档