3 Stimmen

Lösen des ungewöhnlichen Fehlverhaltens "außerhalb des Bereichs"

Ich erstelle eine C# WinForms-App, die alle Vorkommen eines Strings innerhalb einer Datei finden, den Text dazwischen abschneiden und dann eine Verarbeitung durchführen muss.

Die Textdatei hat das folgende Format:

---- Schlüssel_String ----

Text zum Abschneiden 1

---- Schlüssel_String ----

Text zum Abschneiden 2

---- Schlüssel_String ----

Text zum Abschneiden 3

Im Grunde schneide ich "Text1", "Text2" und "Text3" aus dieser Datei heraus.

Und hier ist der Code, um die genannte Aktion auszuführen:

string inhalt = "";
MatchCollection treffer;
using (StreamReader leser = File.OpenText(dateipfad))
{
    inhalt = leser.ReadToEnd();
    treffer = Regex.Matches(inhalt, "Schlüssel_String");
}
int gesamtanzahl = treffer.Count;

for (int i = 0; i < gesamtanzahl; i++)
{
    int indd1 = treffer[i].Index;
    int indd2 = 0;
    string unterinhalt = "";
    if (i != gesamtanzahl - 1)
    {
        indd2 = treffer[i+1].Index;
        try
        {
            unterinhalt = inhalt.Substring(indd1, indd2); // Fehler hier
        }
        catch
        {
            MessageBox.Show("Index 1: "  + indd1 + "\n" +
                "Index 2: "  + indd2 + "\n" +
                "Maximaler Index (Länge - 1): "  + (inhalt.Length - 1)
                );
        }
    }
    else { unterinhalt = inhalt.Substring(indd1); }
    // Verarbeitung von "unterinhalt"
}

Das funktioniert gut für einige meiner Dateien, jedoch erhalte ich in einigen Fällen folgenden Fehler:

Index und Länge müssen auf einer Position innerhalb des Strings verweisen. Parametername: Länge

Es ist sehr seltsam, weil der Unterstring, den ich abschneide, sich INNERHALB des Hauptstrings befindet, und nicht außerhalb, wie Sie vermutet haben. Ich kann es mit der Ausgabe des "try-catch" beweisen:

Index 1: 3211

Index 2: 4557

Maximaler Index (Länge - 1): 5869

Wie Sie sehen können, schneide ich nichts ab, das außerhalb des Indexbereichs liegt, also wo liegt das Problem?

P.S. Ich habe Lösungen gegoogelt, aber die Grundidee in jedem Fall ist - "falscher Index". In meinem Fall - ist der Index "innerhalb" des Bereichs. Nun ja, zumindest denke ich das.

Bearbeiten

Etwas Ähnliches wie dies sollte das Problem lösen:

 public string SubstringFix(string original, int start, int end)
    {
        int endindex = 0;
        if (end < original.Length)
        {
            endindex = end;
        }
        else
        {
            endindex = original.Length - 1;
        }

        return original.Substring(start, (end - start));
    }

3voto

usr Punkte 164863

Substring nimmt keine zwei Indizes an. Es nimmt einen Index und eine Länge. Wahrscheinlich möchten Sie

indd2 - indd1

als zweiten Parameter angeben (und überprüfen Sie diesen Ausdruck auf Off-by-One-Fehler).

1voto

codingbiz Punkte 25598

Mit dem, was du hast, bekommst du das

3211+4557 = 7768

und das ist größer als die Länge des Zeichens.

So funktioniert die Teilzeichenfolge

substring(Startindex, Länge)

Die Länge des Zeichens sollte nicht kleiner sein als StartIndex + Länge

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X