2012-01-22 16 views
1
public void button2_Click(object sender, EventArgs e) 

    { 
     char[] delimiters = { ',', '\r', '\n', ' ' }; 
     string[] content = File.ReadAllText(CSV_File).Split(delimiters); 

     int bounds = (content.GetUpperBound(0)); //bounds of this content string is 96 
     int i = 1; 
     id = new string[(bounds/4)]; //for example index size = 96/4 = 24 

     for (i = 0; i <= (bounds/4); i++) 
     { 
      int rows = (i * 4); // gets every 4th value 
      id[i] = content[rows]; //inserts row 96 into id 24 - fails here 
     } 
    } 

これにしばらくお待ちください。正確なエラーは「インデックスが配列の境界外にありました」です。しかし、どの指数がこれを指しているかわかりません。なぜ「インデックスから範囲外の」例外が発生していますか?

+0

質問タイトルにタグを含めないようにしてください。 –

+0

申し訳ありませんが、タグで十分ですか? –

+0

はい。タグは、SOユーザーにとって関連性の高い質問を見つけるための最も一般的な方法の1つです。そのため、タグを見つけるための質問を分類する必要があると感じる場合は、タグを使用する必要があります。 –

答えて

1

偶然、<の代わりに< =を書いたようです。配列インデックスは長さが1になることに注意してください。

コードを少しきれいにすることをお勧めします。それは余分な大括弧と変数です...

var delimeters = new[] { ',', '\r', '\n', ' ' }; 
var content = File.ReadAllText(CSV_File).Split(delimeters); 

id = content.Where((n, i) => i % 4 == 0).ToArray(); 
+0

私に最後の行を説明できますか?私は長い間コーディングしていません。 また、変数を作成してから、ほとんどの場合、「新規」に割り当てる方が良いでしょうか? –

+0

あなたが新しい人なら、これは説明するのが難しいかもしれません。私は試してみる:) Where関数は、指定された条件(または述語)と一致するすべての要素を返します。この場合、各要素のインデックスが4の倍数であるところをテストします(n%nの倍数は常に0に等しくなります)。 WhereはIEnumerableを返すので、ToArrayは配列にキャストするために必要です。 – YellPika

+0

この関数のドキュメントは、@ http://msdn.microsoft.com/en-us/library/bb549418.aspx – YellPika

1

実際に読んでいるファイルの内容によって異なります。コードはうまくいくようです。

3

forループの<=<に変更してください。

+0

いつも明白なこと...大変感謝しています。 –

0

最後の反復では、インデックス(bounds/4)にアクセスしていますが、有効なインデックス範囲は0から(bounds/4) - 1であるため、例外が発生すると思います。基本的には、配列idの終わりを過ぎて行きます。ループ状態で<=<に変更する必要があります。

1

ベストプラクティスのためには、bounds/4をチェックするのではなく、forループでid.Lengthをチェックする方がよいでしょう。

これは、forループの条件文に<=の代わりに<を使用する必要があると思います。

関連する問題