質問

文字列のリストがあります:

 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つが返されます(鳥はしません)。

それを行うための最速の方法は何ですか?

役に立ちましたか?

解決

使用できます Startswith 内側 どれでも

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

これをダブルとして視覚化できます for ループ、2番目のループ 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