获取“索引超出数组的范围”异常

时间:2012-02-02 17:01:27

标签: c# arrays string exception stream

我们有一个数据表“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();
    }

我们得到的“索引超出了数组的范围”异常。我们无法找到问题。提前谢谢

编辑: tnx给所有帮助过的人。 我这样做了,它以某种方式起作用:

 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();
    }
再次向大家致谢。 问候, Sagar的

4 个答案:

答案 0 :(得分:5)

基于i的方式是行数(即X),而不是字符串数组的长度。因此,您可能有100行,但字符串只分为5个字符串值。

答案 1 :(得分:2)

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...

您需要为该行中的单词数使用有效的索引值 - 目前尚不清楚您要在代码中尝试实现的目标,因此我无法提供示例。

答案 2 :(得分:0)

使用调试器,以查看linewords数组中的内容,并将其与i的值进行比较。调试器是你最好的朋友。

答案 3 :(得分:0)

如果您有一个假设的行“a b c d e”,例如文件中的第一行,而您的数据库“st”包含10行,那么您将在第6次遇到错误时循环执行该过程10次。第6步将字符串拆分为:{a,b,c,d,e},然后尝试获取第5个索引(基于零),这将在数组之外。