Pattern-Matching-Linq
Bin ich mit dem Regulären Ausdruck für die passenden Muster sagen Beispiel im folgenden Beispiel habe ich am passenden string zu zählen Vokale.
void VowelsCountInEachWord()
{
Regex rx = new Regex("[aeiou]");
var words=new string[]
{"aesthetic", "benevolent", "abstract",
"capricious", "complacent", "conciliatory",
"devious", "diligent", "discernible","dogmatic",
"eccentric","fallacious","indifferent","inquisitive",
"meticulous","pertinent","plausible", "reticent"
};
var filter = from w in words where (rx.IsMatch(w.ToLower())) select new
{w,count=VowelsCounting(w)};
foreach (var v in filter)
{
Console.WriteLine("String {0} contains {1} vowels", v.w, v.count);
}
}
public int VowelsCounting(string value)
{
int cnt=0;
foreach (char c in value)
{
switch (c)
{
case 'a':cnt++;break;
case 'e':cnt++;break;
case 'i':cnt++;break;
case 'o':cnt++;break;
case 'u':cnt++;break;
}
}
return cnt++;
}
1) Ohne Verwendung regulärer Ausdruck tut C# bieten jedem Konstrukt für passende Muster?
2) Für die Zählung der einzelnen Zeichen gegen die saite brauche ich leite meine eigene Methode?
- Hoffe, du hast deine Antwort. Bitte fügen Sie eine
regex
tag auf die Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nichts so mächtig wie regex, die alles gibt, um Sie in einem Schuss.
Ich nicht empfehlen, diesen Ansatz, aber ich bin besagt es nur, um zu zeigen, dass Sie könnten einige eingebaute Methode, es zu erreichen. Sie könnten möglicherweise verwenden String.IndexOf und suchen Sie nach "a" beginnend mit dem index 0, und halten Sie tuckern entlang in einer Schleife beim Inkrementieren eines Zählers auf positive Treffer. Dann wiederholen Sie den Vorgang für "e"..."u", aber es wird viel weniger effizient als eine regex-oder eine for-Schleife.
Ein besserer Ansatz wäre, nur Schleife über den string char durch char und entweder füttern Sie, um Ihre bestehende switch-Anweisung oder schauen Sie in einige Sammlung.
Da Sie verwenden möchten, LINQ, hier ist, wie die obige for-Schleife Idee könnte neu geschrieben werden, um zu passen. Hinweis: diese Idee ist ähnlich wie HuBeZa Lösung also +1 gibt. Jedoch, ich verwende eine Liste für das nachschlagen und verwenden die
StringComparison.InvariantCultureIgnoreCase
enumeration Kleinschreibung ignorieren:Meiner ursprünglichen regex Antwort ist unten.
Regex-Ansatz
Gibt es einen besseren regex-Lösung als die, die Sie verwenden. Ich bin mir nicht sicher, ob Sie sich dessen bewusst, so fühlte ich es gerechtfertigt, eine post. In Frage #1 Sie sagte: "ohne die Verwendung von regulären Ausdrücken", aber IMHO, dass Konflikte direkt mit Frage #2, wo Sie fragte, ob Sie hatte, zu leiten Sie Ihre eigene Methode.
Können Sie den code verkürzen, indem Sie mit der Regex.Die Matches-Methode und die Count-Eigenschaft auf der zurückgegebenen MatchCollection:
BTW, du kannst noch weiter kürzen Sie Ihre original-code änderung 2 Artikel:
1) Das string-array-Erklärung (ich habe dies in meinem Beispiel oben)
2) Machen Sie Ihr case-Anweisungen fallen durch das nächste case label:
EDIT: aktualisiert mit einer LINQ-Abfrage. Es ist nicht viel anders als das, was der OP hatte, nur mit dem Spiele-Ansatz.
Deine Lösung ist nicht schlecht, aber wenn Sie darauf bestehen:
Edit:, Wie einige hier vorgeschlagen, die ich entfernt ToCharArray, fügte ich ToLower check & auch eine null Vokale filter.
Folgende Lösung, nur Elemente enthalten, wenn es enthält Vokale und es wird auch die Schnellste Lösung.
ToCharArray
ist nicht notwendig, dastring
implementiertIEnumerable<char>
. Jedoch, dieIEnumerable<T>
- Erweiterung Methoden nicht verfügbar sind, in Visual Studio für Dubiose Gründe: stackoverflow.com/questions/345883/...ToLower
und fügen Sie einfach die Vergleiche zum oberen Fall.Jeder macht dies viel zu Komplex:
Natürlich, wenn Sie nicht brauchen, eine Liste der Wörter, die Vokale (das, was Worte nicht?) und alles, was Sie tun möchten, ist die Ausgabe der zählt, dann ist es einfacher, einfach eine Schleife verwenden.