SearchValues für schnelle Zeichensuche
- Matt
Eine Validierung, die bei jedem Aufruf prüft, ob ein String verbotene Zeichen enthält, landet schnell bei IndexOfAny(char[]). Funktioniert, ist aber bei jedem Aufruf eine neue lineare Suche ohne Vorwissen über die Zeichenmenge.
SearchValues<char> aus System.Buffers kapselt genau dieses Vorwissen. Man erzeugt die Instanz einmal und hält sie als static readonly fest:
private static readonly SearchValues<char> VerboteneZeichen =
SearchValues.Create("<>&\"'");
bool enthaeltVerbotenes = eingabe.AsSpan().ContainsAny(VerboteneZeichen);
Intern baut SearchValues.Create je nach Zeichenmenge und Länge eine passende Struktur, die SIMD-Instruktionen nutzt, um mehrere Zeichen gleichzeitig zu vergleichen. Das lohnt sich nur, wenn dieselbe Instanz wiederverwendet wird – bei jedem Aufruf neu erzeugt, ist der Aufbau selbst die Kostenstelle.
ContainsAny, IndexOfAny und IndexOfAnyExcept auf Span<char> und ReadOnlySpan<char> akzeptieren SearchValues<T> direkt, seit .NET 8. Es gibt auch Overloads für byte und, mit StringComparison, für ganze String-Mengen statt einzelner Zeichen.