Получение индекса было за пределами исключения массива

у нас есть datatable "st" с двумя столбцами "word" и "binary"

void replace()
    {

        string s1="", s2="";            
        StreamReader streamReader;
        streamReader = File.OpenText("C:\\text.txt");
        StreamWriter streamWriter = File.CreateText("C:\\sample1.txt");
        int x = st.Rows.Count;
       // int i1 = 0;                                       
            // Now, read the entire file into a string
            while ((line = streamReader.ReadLine()) != null)
            {
                for (int i = 0; i < x; i++)
                {

                s1 = Convert.ToString(st.Rows[i]["Word"]);
                s2 = Convert.ToString(st.Rows[i]["Binary"]);
                s2+="000";
                char[] delimiterChars = { ' ', '\t' };
                String[] words = line.Split(delimiterChars);

                    // Write the modification into the same file                    
                String ab = words[i]; //exception occurs here
                // Console.WriteLine(ab);
                streamWriter.Write(ab.Replace(s1,s2));                                 
                }                
            }
        streamReader.Close();
        streamWriter.Close();
    }

мы получаем исключение «Индекс был за пределами массива». мы не можем найти проблему. заранее спасибо

РЕДАКТИРОВАТЬ: спасибо всем, кто помог. я сделал это, и это сработало как-то:

 void replace()
    {
        string s1 = "", s2 = "";
        StreamReader streamReader;
        streamReader = File.OpenText("C:\\sample1.txt");
        StreamWriter streamWriter = File.CreateText("C:\\sample1.txt");
        int x = st.Rows.Count;           
        while ((line = streamReader.ReadLine()) != null)
        {
            char[] delimiterChars = { ' ', '\t' };
            String[] words = line.Split(delimiterChars);
            foreach (string str in words)
            {

                s1 = str;
                DataRow drow = st.Rows.Find(str);
                if (drow != null)
                {
                    index = st.Rows.IndexOf(drow);
                    s2 = Convert.ToString(st.Rows[index]["Binary"]);
                  // s2 += "000";
                    // ab = words[i];                        
                    Console.WriteLine(s1);
                    Console.WriteLine(s2);
                    streamWriter.Write(str.Replace(s1, s2));                                 
                }
                else
                    break;
            }               
        }
        streamReader.Close();
        streamWriter.Close();
    }

Спасибо всем еще раз. привет, сагар


person vidya sagar    schedule 02.02.2012    source источник


Ответы (4)


Если у вас есть гипотетическая строка «a b c d e», например, первая строка в вашем файле, а ваша база данных «st» содержит 10 строк, вы должны выполнить процесс 10 раз, а в 6-й раз вы столкнетесь с ошибкой. Шестой шаг разделит строку на: {a, b, c, d, e}, а затем попытается получить 5-й индекс (отсчитываемый от нуля), который будет находиться за пределами массива.

person GrayWizardx    schedule 02.02.2012
comment
так как я могу избежать этого? помогите пожалуйста - person vidya sagar; 02.02.2012
comment
@vidya, если я понимаю ваше приложение из примера, вы ищете слова для замены в строке, а затем возвращаете измененную строку в файл. Сначала я бы поднял все шаги за пределы внутреннего цикла, которые вы можете, разбивая строку и символы-разделители можно выполнить вне цикла for. Затем в цикле for вы действительно хотите просмотреть каждое слово в разделенной строке, которое нужно заменить. Один из способов сделать это — добавить цикл for, который выполняет итерацию по каждому разделяемому слову. Более простым и понятным методом было бы использование List‹string› и методов расширения. - person GrayWizardx; 02.02.2012

То, как вы основываетесь на i, - это количество строк, также известное как X, а не длина массива строк. Поэтому у вас может быть 100 строк, но строка разбита только на 5 строковых значений.

person Brad Semrad    schedule 02.02.2012

i — это индекс строки, на которой вы находитесь.

while ((line = streamReader.ReadLine()) != null)
{
   for (int i = 0; i < x; i++)  // say we are on line 20

words содержит массив слов в этой строке.

String[] words = line.Split(delimiterChars); // say there are 3 words on line 20

Если в строке меньше слов, чем индекс строки... вы получаете исключение за пределами.

String ab = words[i]; // trying to get to word 20 out of 3...

Вам нужно использовать допустимое значение индекса для количества слов в этой строке — неясно, чего именно вы пытаетесь достичь в своем коде, поэтому я не могу привести пример.

person Oded    schedule 02.02.2012

Используйте отладчик, чтобы посмотреть, что находится в line и в массиве words, и сравнить это со значением i. Отладчик — ваш лучший друг.

person Olivier Jacot-Descombes    schedule 02.02.2012