Ich möchte Vokale aus dem String-Array entfernen, aber ich habe es jetzt mit foreach-Loops gemacht möchte es mit LINQ oder Lambda Ausdruck ausführen
Ich habe den folgenden Code LINQ versucht
%Vor%Aber ich bekomme nicht, was erwartet wird.
Ausgabe, die ich mit der obigen Abfrage bekomme, ist: -
%Vor%Gewünschte Ausgabe:
%Vor% Obwohl Yaakovs reg-ex-Lösung in puncto Eleganz und Effizienz viel besser ist, können Sie Where
dafür verwenden um des Lernens willen:
Sie können dies sehr effizient mit regulären Ausdrücken erreichen, um alle Vokale zu vergleichen und sie durch leere Zeichenfolgen zu ersetzen:
%Vor%Dies gibt die gesuchten Ausgaben zurück.
Dein ursprünglicher Versuch hat nicht funktioniert, weil er jedes Wort für jeden einzelnen Vokal, den er enthielt, einzeln ausgewertet hat.
Update : Ich habe einige grundlegende Benchmarks dieser Lösung im Vergleich zu Mathias ' HashSet<char>
based solution ( Benchmark-Code hier ), einschließlich Compile- und Noncompiled-Versionen der Regex-Version. Ich habe es gegen eine Reihe von 2582 Lorem-Ipsum-Wörtern gelaufen, die 10 Millionen Mal gegen das Set iteriert haben (also etwa 25 Milliarden Wörter) und es in LinqPad laufen lassen, wobei ich den Durchschnitt von 3 Läufen genommen habe:
Es stellt sich heraus, dass wenn Sie nur HashSet
und pattern string
einmal initialisieren, haben sie eine sehr ähnliche Leistung. Regex
schlägt Hashset
, aber nur knapp (80 ms schneller als 25 Milliarden Wörter) und Regex Compiled und Noncompiled arbeiten fast identisch. Wenn Sie das HashSet jedoch jedes Mal initialisieren, wenn Sie es ausführen, wird die Leistung für den HashSet-Ansatz beendet.
Wenn Sie den HashSet
-Ansatz verwenden möchten, sollten Sie sicherstellen, dass Sie HashSet
nur einmal pro Satz von Zeichen, die Sie ausschließen möchten, initialisieren.