Wie können Sie in C#in einer Liste die schnellste Art und Weise suchen, um nach Elementen zu suchen, aber eine "Startswith ()" -Suche durchzuführen?

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

Frage

Ich habe eine Liste von Saiten:

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

Und jetzt möchte ich eine solche Funktion:

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

Aber anstatt zu enthält, möchte ich, dass es einen Start mit Scheck ausführt, so dass 4 der 5 Artikel zurückgegeben würden (Vogel würde nicht).

Was ist der schnellste Weg, das zu tun?

War es hilfreich?

Lösung

Sie können verwenden Beginnt mit Innen von an Irgendein

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

Sie können dies als Double visualisieren for Schleife mit der zweiten for ausbrechen, sobald es trifft a true Fall

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;

Andere Tipps

Der schnellste Weg wäre die Verwendung einer anderen Datenstruktur, beispielsweise Tries. Grundlegende C# -Implementierung finden Sie hier: https://github.com/kpol/trie

Dies sollte Ihnen das bekommen, was Sie in einem vereinfachten Format benötigen:

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

Die Trie -Datenstruktur ist das, was Sie brauchen. Schauen Sie sich diese reifere Bibliothek an: 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");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top