Laden...

list<> ausgeben ==> ArgumentOutOfRangeException

Erstellt von DieterM vor 13 Jahren Letzter Beitrag vor 13 Jahren 8.229 Views
Thema geschlossen
D
DieterM Themenstarter:in
5 Beiträge seit 2011
vor 13 Jahren
list<> ausgeben ==> ArgumentOutOfRangeException

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

B
198 Beiträge seit 2005
vor 13 Jahren

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;
        }
1.130 Beiträge seit 2007
vor 13 Jahren

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

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

D
DieterM Themenstarter:in
5 Beiträge seit 2011
vor 13 Jahren

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

699 Beiträge seit 2007
vor 13 Jahren

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

3.170 Beiträge seit 2006
vor 13 Jahren

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

Hinweis von MarsStein vor 13 Jahren

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

Thema geschlossen