在C#中,搜索列表中搜索元素的最快方法是什么,但是进行“ startswith()”搜索?

StackOverflow https://stackoverflow.com/questions/19849923

我有一个字符串清单:

 var list = new List<string>();
 list.Add("CAT");
 list.Add("DOG");

var listofItems = new List<string>();
 listofItems .Add("CATS ARE GOOD");
 listofItems .Add("DOGS ARE NICE");
 listofItems .Add("BIRD");
 listofItems .Add("CATAPULT");
 listofItems .Add("DOGGY");

现在我想要这样的功能:

 listofItems.Where(r=> list.Contains(r));

但是,我希望它可以开始进行检查,以便返回5个项目中的4个(Bird不会)。

最快的方法是什么?

有帮助吗?

解决方案

您可以使用 以。。开始 内部 任何

listofItems.Where(item=>list.Any(startsWithWord=>item.StartsWith(startsWithWord)))

您可以将其视为双重 for 循环,第二个 for 爆发一击就爆发 true 案子

var filteredList = new List<String>();
foreach(var item in listOfItems)
{
    foreach(var startsWithWord in list)
    {
        if(item.StartsWith(startsWithWord))
        {
            filteredList.Add(item)
            break;
        }
    }
}
return filteredList;

其他提示

最快的方法是使用另一种数据结构,例如Trie。基本C#可以在此处找到: https://github.com/kpol/trie

这应该为您提供更简单的格式所需的东西:

 var result = listofItems.Select(n =>
 {
      bool res = list.Any(v => n.StartsWith(v));
      return res 
               ? n 
               : string.Empty;
 }).Where(b => !b.Equals(string.Empty));

TRIE数据结构是您需要的。看看这个更成熟的图书馆: Trienet

using Gma.DataStructures.StringSearch;

...

var trie = new SuffixTrie<int>(3);

trie.Add("hello", 1);
trie.Add("world", 2);
trie.Add("hell", 3);

var result = trie.Retrieve("hel");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top