Einfache Möglichkeit zur Suche nach einem string für Zeichenketten
Ich versuche zu finden, der einfachste Weg, um suchen Sie einen string
für eine ganze Reihe von möglichen string
s. Ich weiß der einfache Weg, dies zu tun für Zeichen zu verwenden myString.IndexOfAny(charArray)
. Aber wie was ist, wenn möchte ich mit meiner Suche string
für string
s und nicht nur Zeichen? Gibt es irgendwelche .net tricks oder Methoden, die dies erleichtern?
Grundsätzlich, ich würde gerne etwas wie das hier tun:
string myName = "rahkim";
string[] names = new string[] {"joe","bob","chris"};
if(myName.IndexOfAny(names) >= 0)
{
//success code//
}
Ich weiß, es gibt Möglichkeiten, dies zu tun mit Schleifen, etc. Aber ich hatte gehofft, für etwas, das inhärent in den Rahmen.
Ich bin nicht einverstanden mit der "duplizieren". Scheint, er will die Suche nach einem Teilstring innerhalb jeder string in dem array.
wo bekommt man die ab, er hat eindeutig myName und die Suche durch eine Reihe von "Namen"?
Von IndexOfAny(...), es sei denn, er ist schrecklich verwirrt über C# string-Methoden.
Sorry für etwaige Verwirrung. Meine Verwendung von IndexOfAny in dem Beispiel war wohl irreführend. Ich war im Grunde der Hoffnung auf eine "ähnliche" Lösung eingeben.
wo bekommt man die ab, er hat eindeutig myName und die Suche durch eine Reihe von "Namen"?
Von IndexOfAny(...), es sei denn, er ist schrecklich verwirrt über C# string-Methoden.
Sorry für etwaige Verwirrung. Meine Verwendung von IndexOfAny in dem Beispiel war wohl irreführend. Ich war im Grunde der Hoffnung auf eine "ähnliche" Lösung eingeben.
InformationsquelleAutor rahkim | 2009-04-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie (auch) verwenden die
static
IndexOf
Methode derArray
Klasse:InformationsquelleAutor Pat
Sollten Sie definieren, wenn Sie wollen, um zu finden, gleich Saiten, oder suchen Sie einen passenden Teilstring. Beide Wege sind leicht pre-LINQ und LINQ.
Gleich Zeichenfolgen, LINQ
Gleich Zeichenfolgen, Pre-LINQ
Teilstrings, LINQ
Substring, Pre-LINQ
Das ist, weil es sein sollte:
bool contains = new List<string>(names).Contains(myName);
BTW, Teilzeichenfolgen, LINQ kann auch kürzer sein:bool contains = names.Any(myName.Contains);
InformationsquelleAutor Samuel
Wenn jemand anderes gefunden, das, während Sie versuchen, Suche nach einem .Netto-Methode wie String.IndexOfAny(String[]), dies ist meine Lösung:
C#
VB
Können Sie eine LastIndexOfAny(String[]) nur durch Umschalten der
zu
Oh, guter Punkt, danke 🙂
InformationsquelleAutor Laurence
int IndexOfAny(String[] rgs) wäre in der Tat schön, aber es ist nominell ein O(n^2) - operation. Wenn Sie in Ihrer Anwendung den Satz von Saiten rgs ist groß und immer die gleichen, die die meisten effizienter Ansatz ist, laden Sie Sie in ein trie Datenstruktur einmal, und verwenden Sie dann die versuche wiederholt, um die Suche für Sie innerhalb der unbekannte angegebenen Zeichenfolgen zur Laufzeit.
Hier ist der relevante code, angepasst von einem C# - trie-Quelle, die ich im web gefunden, zurückzuführen auf "Kerry D. Wong." In meiner version, jede Zeichenfolge im trie hat eine "Nutzlast" von generischen Typ TValue. Dies zu nutzen versuchten, um einfach die Suche nach Teilzeichenfolgen ist, werden die Nutzdaten könnten immer auf wahr, wie abgebildet, mit simple_trie.
Die andere Sache, die ich geändert habe ist, dass diese versuchten passt sich automatisch erlauben, speichern Sie beliebige Unicode-Zeichenfolgen. Das array an jedem Knoten—was charakterisiert eine trie—passt seine Basis und Länge, um Platz für die Auswahl von Unicode-Zeichen, die gespeichert werden müssen in diesem Knoten. Dies ermöglicht eine case-sensitive matching, zum Beispiel.
C# - 3.0-Initialisierung syntax ist praktisch für die dies versuchten, aber die Aktivierung erfordert es eine dummy-Implementierung von IEnumerable, um zu kompilieren. Die CLR-scheint nicht zu nennen GetEnumerator() und ich schlage vor, dass Sie nicht versuchen, aufzuzählen, mit deren Ergebnis entweder.
ein einfacher Ansatz, aber die sich daraus ergebende Komplexität ist manchmal nicht klar oder transparent. Meine Lösung ist, wie angedeutet, in der ersten Zeile meines Postings, kann es sinnvoller sein, wenn nur die Leistung ist entscheidend, denn es sorgt für eine transparente Garantien auf Zeit-Komplexität.
Um genau zu sein,
IndexOfAny(String[])
ist nicht wirklich O(n^2) aber mehr wie O(n*m) mit n wird die Größe der Zeichenfolge, in der die Suche stattfindet, und m wird die (maximale) Länge des strings gesucht wird, vorausgesetzt, die Anzahl der Saiten ist klein im Vergleich zu n und m.InformationsquelleAutor Glenn Slayden
Hier ist die richtige syntax:
I dont get 'Enthält' als option. Bekomme ich nur die array-Methoden, wenn die intellisense angezeigt.
Gehören Linq, um die Erweiterung - siehe die doppelte Frage
Ich habe die Linq-extension. Jeder andere Weg, dies zu tun?
InformationsquelleAutor Jose Basilio
InformationsquelleAutor TStamper