C/C++では、あまりなじみがありません(C++のアルゴリズム関数にfor_eachメソッドというのがありますが・・・)がVBではおなじみのforeach文がC#では使えます。
foreach文は次のような形になります。
foreach (データ型 変数名 in 配列名)
{
...
}
foreach文では、添え字のもっとも小さいものから順番に調べていき、変数に代入されます。...が1つの文だけであれば{}は省略できます。
// foreach01.cs
using System;
class foreach01
{
public static void Main()
{
string[] st = new string[] {"猫でも", "わかる", "プログラミング"};
foreach (string s in st)
Console.Write(s);
Console.Write("\n");
}
}
この例では、string型の配列stに対してforeach文が適応されています。
st[0]から順に変数sに代入され、Console.Write(s)で画面に表示されます。
結局画面には「猫でもわかるプログラミング」と表示されるはずです。
次は、もうちょっと実用的な例です。
その前に、ArrayListクラスについて、ちょっと説明しておきます。
第6章で解説した配列について不満はありませんか。ここで解説した配列は、最初から要素数が決まっていました。途中で配列の要素数を加減できませんでした。 ユーザー入力により、自由に配列の長さが伸張すれば便利ですね。それを実現するのがArrayListクラスです。(ただし、C#2.0の出現によりもっと効率的なものが出てきました。ジェネリックListクラスというものです。ジェネリックについては後の章で解説します。)
ArrayListクラスは、サイズが動的に増加する配列を実現します。
System.Collections名前空間で定義されてるので、using System.Collections;をプログラムの冒頭に書いておくと便利です。
さしあたって必要なメソッドはAddメソッドです。
public virtual int Add (
Object value
)
配列の末尾にデータ(value)を追加します。Countプロパティは要素の数を返します。
ArrayList インスタンス名 = new ArrayList();で、オブジェクトを生成してから使います。
// foreach02.cs
using System;
using System.Collections;
class foeach02
{
public static void Main()
{
ArrayList al = new ArrayList();
while (true)
{
Console.Write("(xで終了)データ:");
string strData = Console.ReadLine();
if (strData == "")
return;
if (!char.IsDigit(strData[0]) && strData[0] != '-')
break;
double dData = double.Parse(strData);
al.Add(dData);
}
double sum = 0.0;
if (al.Count == 0)
{
Console.WriteLine("データが有りません");
return;
}
foreach (double d in al)
{
sum += d;
}
Console.WriteLine("データ数:{0, 6}\n合計:{1, 10}\n平均:{2, 10}",
al.Count, sum, sum / al.Count);
}
}
まず、ArrayListクラスのインスタンスを作成しておきます。無限ループで、ユーザーにデータを入力させます。
ユーザーが何も入力せずにいきなり、エンターキーを押したときは、
if (strData == "")
return;
で、プログラムを終了してしまいます。入力された文字列を解析して、最初の文字が10進数でも、マイナス記号でも無いときはbreak文で無限ループを脱出します。
if (!char.IsDigit(strData[0]) && strData[0] != '-')
break;
charクラスのIsDigitプロパティについては、第12章で解説がありますので忘れた人は読んでみてください。ここまで、進んでこれたら文字列をdouble型に変換してdDataに格納します。
(本当はユーザー入力をもうちょっと検査しないと、実行時エラーが出ることがありますが、煩雑になるので省略しています。たとえば2pなど2文字目以降に数字以外が入力されたときなど)
double型に変換したデータを
al.Add(dData);で、配列の末尾に追加しています。
ユーザーがいきなり、xとか数字以外を入力してしまったときは、配列には何も格納されていないので「データが有りません」と表示してプログラムを終了させます。
データが存在する場合は、foreach文で各要素の合計を求めます。
foreach (double d in al)
{
sum += d;
}
これは、簡単ですね。alの添え字の最小値(0)から最大値までが順にdに入力され、sum +=d;で合計が計算されます。もちろんfor文を使って合計を計算することも可能です。合計が出たら、平均値を出すのは簡単ですね。
データ入力を終了するには'x'に限らず、数字以外を入力してエンターキーを押せばよいですね。
Update 24/Aug/2006 By Y.Kumei