En C #, quel est le moyen le plus rapide de rechercher des éléments dans une liste mais faire une recherche "startWith ()"?

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

Question

J'ai une liste de chaînes:

 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");

Et maintenant je veux une fonction comme ceci:

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

Mais au lieu de se contenter, je veux qu'il fasse un début avec un chèque, donc 4 des 5 articles seraient retournés (l'oiseau ne le ferait pas).

Quel est le moyen le plus rapide de faire cela?

Était-ce utile?

La solution

Vous pouvez utiliser Commence avec à l'intérieur d'un N'importe quel

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

Vous pouvez visualiser cela comme un double for boucle, avec la seconde for éclater dès qu'il frappe un true Cas

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;

Autres conseils

Le moyen le plus rapide serait l'utilisation d'une autre structure de données, par exemple Trie. La mise en œuvre de base C # peut être trouvée ici: https://github.com/kpol/trie

Cela devrait vous offrir ce dont vous avez besoin dans un format plus simplifié:

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

La structure de données Trie est ce dont vous avez besoin. Jetez un œil à cette bibliothèque plus mature: 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");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top