QA@IT

foreach構文で文字配列代入がうまくいかない。

4515 PV

C#初心者です。

jpffilesという配列に、あるフォルダのjpg拡張子を含むファイル名の配列をいれています。
これをforeachをつかって"あいう"という文字列がファイル名に含まれるものの配列(files)を新たに作ろうとするのですが、失敗してしまいます。

エラーの内容は

型 'System.IndexOutOfRangeException' のハンドルされていない例外が ××××.cs で発生しました
追加情報: インデックスが配列の境界外です。

となっています。ご教示ください。

string watchfilepathbase="あいう";
string[] files={};
int i=0;

string[] jpgfiles = System.IO.Directory.GetFiles(watchfolderpath, "*.jpg");

          foreach (String r in jpgfiles)
          {
            if (r.Contains(watchfilepathbase))
            {
              files[i]=r;
              i++;
            }
          }

回答

サイズが 0の配列(files)に対して、存在しない場所を書き換えようとしているためです。
登録する前にサイズ拡張したり、あらかじめ大きめにサイズをとっておきあとで縮小するなどの操作が必要になりますが、配列はこの手の操作が苦手です。

filesはstring配列ではなくList<string>にして、Addメソッドで登録する様にした方が良いでしょう。
インスタンスの生成、要素の追加・削除など配列と異なる部分はありますが、要素の取り出しなどは配列と同じ様にfiles[0]などで扱えます。積極的にListなどコレクションを使っていくことをお勧めします。

最終的にどうしてもstring配列が必要になった場合はToArrayメソッドで変換する事が出来ます。

コレクション (C# および Visual Basic)
http://msdn.microsoft.com/ja-jp/library/ybcx56wz.aspx

編集 履歴 (0)
  • filed_onion 2650 様

    配列とリストのメモリの確保の仕方に違いがあるんですね。勉強になりました。早速リストでやってみたところ問題なく動作しました。

    扱い方も簡単なのでListを積極的に使っていくことにします。
    ご教示いただきありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。