ArgumentOutOfRange w funkcji LastIndexOf(String,int,int)

0

Witam,
w swoim programie mam funkcję która koloruje mi odpowiednie wyrazy w richtextbox na różne kolory.
Gdy napotka więcej niż jedno wystąpienie danego słowa koloruje skrajne wystąpienia i szuka "do środka". Używam dwóch funkcji IndexOf i LastIndexOf do wyszukiwania kolejnych wystąpień jednak dla drugiej z tych funkcji mimo takich samych arg. jak w przypadku IndexOf(!!!) otrzymuje wyjątek.
Kod:

            int position = 0;
            Font temp = richTextBox1.Font;
            foreach (string s in Globals.key_words)
            {
                position = richTextBox1.Text.IndexOf(s);
                int check = richTextBox1.Text.LastIndexOf(s);
                while (check > position)
                {
                    koloruj_slowa_kluczowe_na_poz(position, s.Length);
                    koloruj_slowa_kluczowe_na_poz(check, s.Length);

                    int old_pos = position;//  0=0
                    int tempos = richTextBox1.Text.Length; // 11
                    int WTF = check - position - 2; //5
                        position = richTextBox1.Text.IndexOf(s, position+1, check - position-2); //nie znajduje = -1, ale nie zgłasza wyjątku
                        int WTF1 = check - old_pos - 2;//5

                        check = richTextBox1.Text.LastIndexOf(s, old_pos+1, check - old_pos-2);//out of range exception
                       
                    
                    
                }
                koloruj_slowa_kluczowe_na_poz(position, s.Length); 

Jaka jest różnica pomiędzy LastIndexOf i IndexOf skoro jenda wyrzuca wyjątek a inna nie? Proszę o pomoc.

0

Jedyna różnica to taka że jedna znajduje pierwszy a druga ostatni index szukanego słowa litery. Nie wywala Ci błędu przy -1 ponieważ -1 oznacza że nie znaleziono tego czego poszukujesz. W drugim przypadku po prostu wylatujesz za obszar co znaczy że coś masz namieszane.

Przykładowo cytat z msdn-a odnośnie zwracanej wartości LastIndexOf

Return Value
Type: System.Int32
The zero-based index position of value if that string is found, or -1 if it is not found or if the current instance equals String.Empty. If value is Empty, the return value is the smaller of startIndex and the last index position in this instance.

http://msdn.microsoft.com/en-us/library/d0z3tk9t.aspx
http://msdn.microsoft.com/en-us/library/d93tkzah.aspx

0
DibbyDum napisał(a):

W drugim przypadku po prostu wylatujesz za obszar co znaczy że coś masz namieszane.

Poza obszar czego? Bo na pewno nie rozmiaru richtextboxa (wielkość 11 tak jak w komentarzu). Parametry których użyłem w obu funkcjach są takie same (check = 7; oldpos = position = 0;)

Można się spodziewać, że lastIndexOf zwróci -1 tak jak IndexOf (skoro nie znaleziono wcale to lastIndex też powinnien być -1). Tak wskazywałaby logika, jednak wyrzuca wyjątek nie wiadomo skąd.

0

Noto możliwe że ze stringiem który podajesz jest coś nie tak:

count is negative.
-or-
The current instance does not equal String.Empty, and startIndex is negative.
-or-
The current instance does not equal String.Empty, and startIndex is greater than the length of this instance.
-or-
The current instance does not equal String.Empty, and startIndex - count + 1 specifies a position that is not within this instance.

EDIT:

Więc po prostu sprawdź czy nie podajesz tam przypadkiem stringa = "". Jeśli tak to LastIndexOf wywali ci błąd a IndexOf nie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1