Antworten:
Folgendes wäre aus meiner Sicht die einfachste Methode:
var match = str.IndexOfAny(new char[] { '*', '&', '#' }) != -1
Oder in einer möglicherweise leichter lesbaren Form:
var match = str.IndexOfAny("*&#".ToCharArray()) != -1
Je nach Kontext und erforderlicher Leistung möchten Sie das char-Array möglicherweise zwischenspeichern oder nicht.
Wie andere gesagt haben, verwenden Sie IndexOfAny. Ich würde es jedoch folgendermaßen verwenden:
private static readonly char[] Punctuation = "*&#...".ToCharArray();
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
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:
private const string Punctuation = "*&#...";
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation.ToCharArray()) >= 0;
}
oder
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny("*&#...".ToCharArray()) >= 0;
}
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.
private static readonly HashSet<char> Punctuation = new HashSet<char>("*&#...");
public static bool ContainsOnePunctuationMark(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)
{
return false; // This is the second punctuation character
}
seenOne = true;
}
}
return seenOne;
}
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.
private static char[] characters = new char [] { '*','&',... };
public static bool ContainsOneCharacter(string text)
{
var intersection = text.Intersect(characters).ToList();
if( intersection.Count != 1)
return false; // Make sure there is only one character in the text
// Get a count of all of the one found character
if (1 == text.Count(t => t == intersection[0]) )
return true;
return false;
}
String.IndexOfAny(Char[])
Hier ist die Dokumentation von Microsoft .
Vielen Dank an euch alle! (Und hauptsächlich Jon!): Dadurch konnte ich Folgendes schreiben:
private static readonly char[] Punctuation = "$€£".ToCharArray();
public static bool IsPrice(this string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
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".