En C#, ¿cuál es la forma más rápida de buscar elementos en una lista pero hacer una búsqueda "Inicio con ()"?

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

Pregunta

Tengo una lista de cuerdas:

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

Y ahora quiero una función como esta:

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

Pero en lugar de contener, quiero que haga un comienzo con cheque para que se devuelvan 4 de los 5 elementos (el pájaro no).

¿Cuál es la forma más rápida de hacer eso?

¿Fue útil?

Solución

Puedes usar Comienza con dentro de un Ningún

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

Puedes visualizar esto como un doble for bucle, con el segundo for estallar tan pronto como golpea un true caso

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;

Otros consejos

La forma más rápida sería el uso de otra estructura de datos, por ejemplo, Trie. La implementación básica de C# se puede encontrar aquí: https://github.com/kpol/trie

Esto debería conseguirle lo que necesita en un formato más simplificado:

 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 estructura de datos Trie es lo que necesita. Eche un vistazo a esta biblioteca más madura: 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");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top