gpt4 book ai didi

c# - 针对列表的多个搜索关键字

转载 作者:行者123 更新时间:2023-12-03 10:46:30 24 4
gpt4 key购买 nike

现在已经花了几天的时间来找出最有效的方法,该方法是搜索包含数千个具有多个关键字且没有特定顺序的项目的列表。我已经在其他屏幕上实现了简单搜索,但是这有些棘手。让我解释。

所以可以说我的 list 如下

  • 武术
  • 死亡游戏
  • IP管理员
  • 保护者
  • 喜剧
  • 沿着
  • 骑行
  • 警察学院
  • 主播
  • 愤怒管理
  • Action

    血液和骨头
  • 矩阵
  • 美国队长
  • 终结者

  • 如果我在搜索框中输入关键字“man”,我希望看到3次匹配,这很容易实现。但是,如果我输入“ma”或“maa”之类的部分关键字,我希望只会看到Anger Management。如果点击次数不止一次,那么我应该可以通过键入更多单词或仅在搜索框中填写我的关键字来缩小搜索范围。

    现在我有一些实现,但是由于我正在执行的迭代次数,我对此不太满意。恐怕当我们有更多数据时,此搜索将无法有效执行并且会很慢。
    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;
    }

    非常感谢您的帮助。

    最佳答案

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

    无论如何,您的代码都会简化为:

    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();
    }

    这似乎还不错。唯一引人注意的是,您只返回“包含”和“以”开头的词条,但这意味着您仅返回“以”开始的词条,而忽略任何“包含”的词条。那可能需要重新考虑。

    现在,您可以进一步简化此代码:
    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列表中没有重复项):
    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();
    }

    关于c# - 针对列表的多个搜索关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24005036/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com