Auf diese Weise erstellen Sie nicht bei jedem Aufruf ein neues Array. Die Zeichenfolge ist auch einfacher zu scannen als eine Reihe von Zeichenliteralen, IMO.
Wenn Sie dies nur einmal verwenden möchten, damit die verschwendete Erstellung kein Problem darstellt, können Sie natürlich Folgendes verwenden:
Es hängt wirklich davon ab, welche Sie besser lesbar finden, ob Sie die Satzzeichen an anderer Stelle verwenden möchten und wie oft die Methode aufgerufen wird.
BEARBEITEN: Hier ist eine Alternative zu Reed Copseys Methode, um herauszufinden, ob eine Zeichenfolge genau eines der Zeichen enthält.
privatestaticreadonlyHashSet<char>Punctuation=newHashSet<char>("*&#...");publicstaticboolContainsOnePunctuationMark(string text){bool seenOne =false;foreach(char c in text){// TODO: Experiment to see whether HashSet is really faster than// Array.Contains. If all the punctuation is ASCII, there are other// alternatives...if(Punctuation.Contains(c)){if(seenOne){returnfalse;// This is the second punctuation character}
seenOne =true;}}return seenOne;}
Ich nehme an, es lohnt sich, das char-Array zwischenzuspeichern, wenn die Leistung ein Problem darstellt, aber es lohnt sich je nach Kontext möglicherweise nicht.
Noldorin
1
Ja, wenn Sie es nur in einer Methode verwenden, die ausgeführt wird, wenn es sich nicht lohnt. Ich denke jedoch, dass es sowohl die Lesbarkeit als auch die Leistung verbessert. ToCharArrayBei Bedarf können Sie natürlich auch das Formular "Inline" verwenden.
Jon Skeet
1
@canon: Wie groß ist das Set? Für sehr, sehr kleine Mengen würde ich erwarten, dass Array.Contains schneller ist. Bei großen Sets wird HashSet wahrscheinlich meilenweit gewinnen.
Jon Skeet
5
Wenn Sie nur sehen möchten, ob es ein Zeichen enthält, würde ich die Verwendung von string.IndexOfAny empfehlen, wie an anderer Stelle vorgeschlagen.
Wenn Sie überprüfen möchten, ob eine Zeichenfolge genau eines der zehn Zeichen und nur eines enthält, wird dies etwas komplizierter. Ich glaube, der schnellste Weg wäre, gegen eine Kreuzung zu prüfen und dann nach Duplikaten zu suchen.
privatestaticchar[] characters =newchar[]{'*','&',...};publicstaticboolContainsOneCharacter(string text){var intersection = text.Intersect(characters).ToList();if( intersection.Count!=1)returnfalse;// Make sure there is only one character in the text// Get a count of all of the one found characterif(1== text.Count(t => t == intersection[0]))returntrue;returnfalse;}
Ja - ich nehme an, eine einzelne Schleife ist in diesem Fall wahrscheinlich schneller, insbesondere bei kleinen Satzzeichen. Ich wäre neugierig, dies mit großen Zeichenfolgen zu testen, um zu sehen, welche wirklich schneller ist.
Reed Copsey
1
Ich denke, dass das Finden des Schnittpunkts der beiden Zeichenfolgen ohnehin Zeichen für Zeichen gehen muss, daher kann ich nicht sehen, wie es schneller sein würde ... und meine vorgeschlagene Route verwendet nicht nur einen einzelnen Durchgang, sondern hat auch den Option eines "Early Out". Stellen Sie sich vor, der Text ist eine Million Zeichen lang, aber die ersten beiden sind beide "*" :)
var specialChars =new[]{'\\','/',':','*','<','>','|','#','{','}','%','~','&'};foreach(var specialChar in specialChars.Where(str.Contains)){Console.Write(string.Format("string must not contain {0}", specialChar));}
Ich suchte nach einer guten Möglichkeit, um festzustellen, ob eine bestimmte Zeichenfolge tatsächlich ein Preis oder ein Satz ist, z. B. "Zu niedrig zum Anzeigen".
Ich weiß, dass dies alt ist, aber um klar zu sein, ist dies kein besonders guter Weg, um Währungen abzugleichen ... Wenn Sie jemanden "Ke $ ha" schreiben lassen würden, würde dies als Preis übereinstimmen ... Verweisen Sie stattdessen auf einen geeigneten Weg zu Hier definierte Währung erkennen: stackoverflow.com/questions/7214513/…
Antworten:
Folgendes wäre aus meiner Sicht die einfachste Methode:
Oder in einer möglicherweise leichter lesbaren Form:
Je nach Kontext und erforderlicher Leistung möchten Sie das char-Array möglicherweise zwischenspeichern oder nicht.
quelle
Wie andere gesagt haben, verwenden Sie IndexOfAny. Ich würde es jedoch folgendermaßen verwenden:
Auf diese Weise erstellen Sie nicht bei jedem Aufruf ein neues Array. Die Zeichenfolge ist auch einfacher zu scannen als eine Reihe von Zeichenliteralen, IMO.
Wenn Sie dies nur einmal verwenden möchten, damit die verschwendete Erstellung kein Problem darstellt, können Sie natürlich Folgendes verwenden:
oder
Es hängt wirklich davon ab, welche Sie besser lesbar finden, ob Sie die Satzzeichen an anderer Stelle verwenden möchten und wie oft die Methode aufgerufen wird.
BEARBEITEN: Hier ist eine Alternative zu Reed Copseys Methode, um herauszufinden, ob eine Zeichenfolge genau eines der Zeichen enthält.
quelle
ToCharArray
Bei Bedarf können Sie natürlich auch das Formular "Inline" verwenden.Wenn Sie nur sehen möchten, ob es ein Zeichen enthält, würde ich die Verwendung von string.IndexOfAny empfehlen, wie an anderer Stelle vorgeschlagen.
Wenn Sie überprüfen möchten, ob eine Zeichenfolge genau eines der zehn Zeichen und nur eines enthält, wird dies etwas komplizierter. Ich glaube, der schnellste Weg wäre, gegen eine Kreuzung zu prüfen und dann nach Duplikaten zu suchen.
quelle
Hier ist die Dokumentation von Microsoft .
quelle
quelle
Vielen Dank an euch alle! (Und hauptsächlich Jon!): Dadurch konnte ich Folgendes schreiben:
Ich suchte nach einer guten Möglichkeit, um festzustellen, ob eine bestimmte Zeichenfolge tatsächlich ein Preis oder ein Satz ist, z. B. "Zu niedrig zum Anzeigen".
quelle