こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C#で配列の配列を使いたいがわかりません。

CSVファイルを読み込み、Splitを使って分割し、配列に入れている。
ここで、textArray[][]のようにしたい。

ファイルの中身は
フラグ、メニュー名、コマンド、引数1、引数2、・・・・
実際のデータは
1、エクスプローラ、explorer
1、イベントビュア、eventvwr.msc、/s
など

おおまかなプログラムは
//リストボックスにメニューのみを表示するボタン
private void button1_click(省略)
{
string path = ファイルパス
system.IO.streamreader textfile;
textfile = new system.IO.・・・・・・・・・・・・
while(true)
省略・・・エラー処理や中身の判別をしている

      line = textfile.readline();
string[] textArray = new string[] {};
textArray = line.split(',');

以下略・・・リストボックスに書き込み、Whileに戻るを書いている
}

//実行ボタン
private void button2_click(省略)
{
process ps = new process();
switch (listbox1.text)
{
case "エクスプローラー":
ps.startInfo.filename = "explorer";
ps.startinfo.arguments = "";
ps.start();
ps.waitforexit();
ps.close();
break;
以下略
}
}

簡単に説明すると、CSVに書いてある管理ツールリストで、フラグ”1”のものをリストに書き出し、
リストから選択したものをコマンドと引数を使って、メニューを起動するというものです。


ここでは、Case文に”エクスプローラー”と””コマンド”を直に書いているが・・・

textArray[0][1] = エクスプローラー
textArray[0][2] = explorer

textArray[i] = 引数 i としたい。
CSVファイルが変わったときにこのままだと対応ができないため、多次元配列もしくはジャグ配列を使いたいと思っています。


汚いプログラムでわからないと思いますが、理解できる方がいましたらよろしくお願い致します。

投稿日時 - 2012-04-24 17:53:07

QNo.7439145

困ってます

質問者が選んだベストアンサー

ひょっとして、C#どころかプログラム自体経験ナシですか?

ps.StartInfo.Arguments="";
for(int i = 2; i < strArrayList[index].Count(); i++)
{
 ps.StartInfo.Arguments += strArrayList[i] + " ";
}

とでもやっておけば引数なしなら空, ありなら引数全てを組み立てたArgumentsが出来あがりますけど。

投稿日時 - 2012-04-26 15:14:45

お礼

ありがとうございます。
経験はVBAを少しとCをちょっとです。
本を読みながらやっています!!

投稿日時 - 2012-04-27 22:01:23

ANo.8

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.7

なお、C#というか.NETの配列型はクラスで要素数を取るためのメソッドCountがあります。

投稿日時 - 2012-04-25 19:30:30

お礼

ありがとうございます。
コマンドは実行できてますがやはり引数は配列指定だと呼び出せないですね。
配列の中身がない!みたいな感じのエラーが出ます。
たしかにエクスプローラに引数はないけど…(-_-;)
引数があるかないかで判定して、外だしのプログラムを呼び出すような
関数はありますか?

投稿日時 - 2012-04-26 11:47:54

ANo.6

SelectedIndexはint型で上から順の選択値。
リストの入力元はList<String[]>の各要素。

つまり、switch~caseなぞ使わなくても元のリストに対してSelectedIndexで特定出来ます。
質問の元データを見る限り、コマンドもデータに入っているようですからそれを使って実行すればOK。

投稿日時 - 2012-04-25 19:27:59

ANo.5

そっちについては、ListBoxの使い方を知らないとしか言えません。

Text使ってswitch~caseで判断なぞしなくてもSelectedIndexで選択要素番号を取得できて、かつListBoxとList<String[]>のインデックスは1:1な訳です。

投稿日時 - 2012-04-25 15:30:16

補足

case switch の条件のところを listbox.Selectedindex
にして値を0,1,2,3 で設定したら出来ました!
あとは繰り返し文で、引数を入力されているだけとるには
どうしたらいいですか?…

投稿日時 - 2012-04-25 17:31:03

お礼

listbox1.selectedindex を使って、どうやってマッチングさせるんですか?
でも、それでもきっと引数のエラーはでますよね。

投稿日時 - 2012-04-25 16:44:20

ANo.4

とりあえず大雑把に説明しときます。詳細は先に書いたMSDNをよーく読んでください。

Listに要素を追加する時にはAdd()を使います。
List<String[]> strArrayList = new List<String[]>();
...
strArrayList.Add(strArray); // strArrayはString.Split()やTextFieldParser.ReadField()の結果であるString[]

参照するときは配列のようにアクセスできます。

strArrayList[0][0] = "text";

ただし、Listは領域を自動的に確保する訳ではないのでString[]をAddしていない領域にアクセスしようとするとIndexOutOfRangeExceptionが飛んできます。

投稿日時 - 2012-04-25 13:27:38

お礼

ありがとうございます。
一応配列はできました。
ただ配列を変えてもやっぱりswitch case で配列を抜き出すことはできませんね。引数を無限に引っ張れないですし。空だとエラー…
直書きするしかないみたいです。

投稿日時 - 2012-04-25 14:42:40

ANo.3

#1でList<String[]>って書いたのにList<String>使ってるのは何故ですか?

投稿日時 - 2012-04-25 12:01:44

補足

今は
String [ ] line = parser.readfields();
で読み込みしてるんですが、やっぱりlist < string [ ] > は使えません。
使う場所の間違いかも知れませんが。

投稿日時 - 2012-04-25 13:32:37

お礼

こちらの入力ミスです…使ってるPCがうち向けのみなので、この質問はスマホでやっているため、手入力ミスが多少あると思います。失礼しました。
PC上はしっかりカッコついてます。
今はsplit を使わなくなっているので、もう一度やってみます!

投稿日時 - 2012-04-25 13:16:28

ANo.2

Listの使い方はとりあえずこれを読みましょう。
http://msdn.microsoft.com/ja-jp/library/6sh2ey19(v=vs.80).aspx

投稿日時 - 2012-04-25 09:13:17

補足

Text fieldparser によるCSVファイル読み込みは出来ました!
参照設定の追加でできました!
あとは多次元をどうやってやるかなんですが…(-_-;)

投稿日時 - 2012-04-25 12:19:14

お礼

ありがとうございます。
list < string >を使うと、split の型 string [ ] 型に暗黙的に変換できません
というエラーが出ます。
この場合だと、split 以外で配列にしないといけないんですか?…
ちなみにtextfieldparser に関しては設定がいろいろあるみたいで、できません
でした。
c # 初なのでそういったものはよくわかりません。

投稿日時 - 2012-04-25 10:58:48

ANo.1

とりあえずStreamReaderとString.Splitを使うのではなくTextFieldParserを使った方が「正しく」読むことができます。
http://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.fileio.textfieldparser.aspx

が、まぁそれはさておいて。
とりあえず簡単に実装するならList<String[]>ですかねぇ。

投稿日時 - 2012-04-24 19:37:49

お礼

ありがとうございます。
list <string[]>?? これはどうやって使うんですか?…

投稿日時 - 2012-04-24 22:07:57

あなたにオススメの質問