Hallo Community,
ich bin noch ein Neuling in C# und stehe momentan vor einem Problem..
Undzwar habe ich folgende Funktion verwendet, um aus einem Text die Mailadressen zu filtern:
public List<string> GetAllEMailAddresses(string text)
{
List<string> Results = new List<string>();
System.Text.RegularExpressions.MatchCollection MC = System.Text.RegularExpressions.Regex.Matches(text, "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
for (int i = 0; i <= MC.Count - 1; i++)
{
if (Results.Contains(MC[i].Value) == false)
{
Results.Add(MC[i].Value);
//Console.WriteLine(Results[i]); // Ausgabe
}
}
return Results;
}
Meinen Versuch die Liste auf der Console auszugeben habe ich mal ausgeklammert, da sich das Programm leider immer aufhängt.
Ich hoffe einer von euch kann mir etwas auf die Sprünge helfen.
Gruß,
DieterM
Gibt es einen speziellen Grund warum gerade das Element aus der Liste ausgeben willst, wenn du den Wert doch sowieso schon in einer Variable stehen hast?
Ich würde auch für die Lesbarkeit die for Schleife in eine foreach Schleife umwandeln
static public List<string> GetAllEMailAddresses(string text)
{
List<string> results = new List<string>();
System.Text.RegularExpressions.MatchCollection MC = System.Text.RegularExpressions.Regex.Matches(text, "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
foreach (Match m in MC)
{
if (!results.Contains(m.Value))
{
results.Add(m.Value);
Console.WriteLine(m.Value); // Ausgabe
}
}
return results;
}
Hallo DieterM und willkommen im Forum.
Mir fallen sofort zwei kleine Stilblüten auf (nichts wirklich schlimmes):
1.) i ≤ MC.Count - 1 Warum nicht einfach < anstatt ≤ ?
2.) == false siehe [Tipp] Anfängerfehler == true / == false
warum nicht gleich foreach?
Wie dem auch sei, das sind keine wirklichen fehler.
Dein regex scheint auch zu funktionieren.
da sich das Programm leider immer aufhängt.
Wo genau? Hast du mal mit dem Debugger angehalten?
Wird etwas ausgegeben, bevor sich das Programm aufhängt?
Mir fallen sonst nur 2 performance-optimierungen ein: Hashset statt List und compliliertes Regex
Mist: Blue_Dragon war schneller
Der Fehler kommt bei:
Console.WriteLine(Results[i]); // Ausgabe
Habe nun auf einmal doch eine Fehlermeldung bekommen:> Fehlermeldung:
Unbehandelte Ausnahme: System.ArgumentOutOfRangeException: Der Index lag außerhlb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.
Danke schonmal für eure Hinweise, werde mich morgen wieder dransetzten.
Gruß,
DieterM
Hallo DieterM,
gebe doch einfach den Value der Iteration in der Console aus.
Console.WriteLine(MC[i].Value);
Ohne zu testen, scheint mir der Index ( _ ) mit dem Du aus dem List<string> den Wert auslesen möchtest, um 1 größer zu sein, als der Index in der List<string>.
Somit macht die Fehlermeldung mit den ArgumentOutOfRangeException wieder sinn.
Das kann man aber sehr gut auch im Debugger sehen, wenn man sich mal das interne Array der List<T> mit dem aktuellen Index der for Schleife vergleicht.
Edit:
Sehe eben, das Blue_Dragon in seinem Beispiel Code, das genau so schon umgesetzt hatte. Schaue dir den Codeabschnitt mit der foreach mal an. Und vor allem eigne Dir die foreach-Schleife an, denn die macht manches einfacher.
Grüße Stephan
Hallo DieterM,
Du fügst die Elemente ja nur zu Deiner Liste hinzu, wenn sie noch nicht vorhanden sind. Wenn eine Adresse doppelt in der MC vorkommt, kommt dann die Exception, weil die Anzahl der Elemente in Results dann zu klein und i kein erlaubter Index mehr ist.
Gruß, MarsStein
Einen solchen Fehler anhand der Fehlermeldung selbst zu finden, gehört zu den Grundlagen, die wir hier voraussetzen.
Bitte beachte generell [Hinweis] Wie poste ich richtig?
Unter Punkt 1.1 und 1.1.1 gibt es auch einige hilfreiche Links, die Dir den Einstieg in C# erleichtern können.
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca