人のソフトの改善/改造の時に、読み解けないのは知識不足。。。
知識不足だけなら、知識を身に着ければOKなわけで、List型を理解していきたいと思います。
List型(リスト型)ってなに?
配列の1っ種ですね!
一言ていうと「登録型配列」かなぁ~!
いや「可長配列」でもいいかもしれません🎵
世の中もので例えるとバインダー的なw
定義の仕方は
A4サイズの紙(型、構造体、クラス)しか入れない、
バインダー(リスト型)を定義するって感じです。
最大値/最小値/合計の取得
最大値の取得だったり、最小値の取得だったり、合計の計算だったりしますよね。
自分がやる方法を3種類紹介します。手段はいくつも知ってていいと思っています。
その時に応じて、処理を選択しましょう。
下記、各々手段をとったときに、どうしていくかサンプルを作ってみました。
◆For文を使う方法
for(int indx = 0; indx < (List型).Count; indx++) { (処理) }
◆Foreach文を使う
foreach(int value in (List型)) { (処理) }
◆実は関数が準備されていて、一行で終わる
(List型).Max(); (List型).Min(); (List型).Sum();
GUIの作成
こんな感じにしました。ボタンをクリックされたら、リストを定義、インスタンスの生成、登録(追加)、そして、目的の最大値、最小値、合計の処理、結果表示です。
For文を使用した時の処理
【実行(For)】ボタン[btnExecute_For]にクリックイベントを追加して、処理を書きました。
private void btnExecute_For_Click(object sender, EventArgs e) { List<int> lstSampleInt = new List<int>(); int[] num = new int[] { 2, 4, 7, 3, 9, 4, 8, 6, 5, 0, 1 }; //数字を登録(追加) lstSampleInt.AddRange(num); //変数定義 初期値設定 int max_for = int.MinValue, min_for = int.MaxValue, sum_for = 0; //要素数分繰り返す for (int indx = 0; indx < lstSampleInt.Count; indx++) { //現在の最大値より大きいか確認 if (max_for < lstSampleInt[indx]) max_for = lstSampleInt[indx]; //現在の最小値より小さいか確認 if (lstSampleInt[indx] < min_for) min_for = lstSampleInt[indx]; //合計を計算 //sum_for += lstSampleInt[indx]; //可能 sum_for = sum_for + lstSampleInt[indx]; } lblMax_for.Text = max_for.ToString(); lblMin_for.Text = min_for.ToString(); lblSum_for.Text = sum_for.ToString(); }
ここでのポイントは初期値です!
最大値の変数の初期値は、int型の最小値を初期値にしています。
最小値は逆で、最小値の変数の初期値は、int型の最大値を初期値とします。
初期値を適当にしたら、不具合の元になるので注意しましょう!!
Foreach文を使用した時の処理
【実行(Foreach)】ボタン[btnExecute_Foreach]にクリックイベントを追加して、処理を書きました。
private void btnExecute_Foreach_Click(object sender, EventArgs e) { List<int> lstSampleInt = new List<int>(); int[] num = new int[] { 2, 4, 7, 3, 9, 4, 8, 6, 5, 0, 1 }; //数字を登録(追加) lstSampleInt.AddRange(num); //変数定義 初期値設定 int max_foreach = int.MinValue, min_foreach = int.MaxValue, sum_foreach = 0; //要素数分繰り返す foreach (int value in lstSampleInt) { //現在の最大値より大きいか確認 if (max_foreach < value) max_foreach = value; //現在の最小値より小さいか確認 if (value < min_foreach) min_foreach = value; //合計を計算 //sum_foreach += value; //可能 sum_foreach = sum_foreach + value; } lblMax_foreach.Text = max_foreach.ToString(); lblMin_foreach.Text = min_foreach.ToString(); lblSum_foreach.Text = sum_foreach.ToString(); }
ここでのポイントもFor文の時と同じで初期値です。
初期値を適当にしたら、不具合の元になるので注意しましょう!!
関数を実行して1行で終わらせる
【実行(1行)】ボタン[btnExecute_1Row]にクリックイベントを追加して、処理を書きました。
private void btnExecute_1Row_Click(object sender, EventArgs e) { List<int> lstSampleInt = new List<int>(); int[] num = new int[] { 2, 4, 7, 3, 9, 4, 8, 6, 5, 0, 1 }; //数字を登録(追加) lstSampleInt.AddRange(num); //変数定義 int max_1Row = lstSampleInt.Max(); int min_1Row = lstSampleInt.Min(); int sum_1Row = lstSampleInt.Sum(); lblMax_1Row.Text = max_1Row.ToString(); lblMin_1Row.Text = min_1Row.ToString(); lblSum_1Row.Text = sum_1Row.ToString(); }
正直に言うと、この方法が一番見る人にやさしいです。
ただ処理時間は、まとめて算出した時に比べると遅くなると考えられます。
平均値の取得
今回の最後は平均値の取得方法です。
先ほどのGUIの下に平均値の取得をつぎ足しました。
そして、またしても実は、関数が準備されています!
これも実は1行で終わるのですが、知っていることはいい事なので紹介します。
まずは平均について知りましょう!知っているとは思いますが。。。
平均とは
平均とは – コトバンク (kotobank.jp)
計算式
List型で平均を求める場合は、合計(総和)を要素数(個数)で割ると言うことになりますね!
[平均] = [合計(総和)] / [要素数]
GUIを作成
繰り返し分から平均値算出
【実行(繰り返しから平均)】ボタン[btnExe_Loop2Ave]にクリックイベントを追加して、処理を書きました。
private void btnExe_Loop2Ave_Click(object sender, EventArgs e) { List<int> lstSampleInt = new List<int>(); int[] num = new int[] { 2, 4, 7, 3, 9, 4, 8, 6, 5, 0, 1 }; //数字を登録(追加) lstSampleInt.AddRange(num); int sum_loop = 0; //要素数分繰り返す foreach (int value in lstSampleInt) { //合計を計算 //sum_loop += value; //可能 sum_loop = sum_loop + value; } //平均値算出 double ave = (double)sum_loop / (double)lstSampleInt.Count; //表示 lblAve_Loop.Text = ave.ToString(); }
注意点としては、今回の平均値の計算が、int型同士で割っていることです。
この場合、受けがdouble型でも、整数の結果が計算されます。。。
そのため、キャスト(型変換)して、型を合わせることを意識しましょう!!
List型の関数から平均を算出する
【実行(平均1行)】ボタン[btnExe_Ave1Row]にクリックイベントを追加して、処理を書きました。
private void btnExe_Ave1Row_Click(object sender, EventArgs e) { List<int> lstSampleInt = new List<int>(); int[] num = new int[] { 2, 4, 7, 3, 9, 4, 8, 6, 5, 0, 1 }; //数字を登録(追加) lstSampleInt.AddRange(num); //平均値算出 double ave = lstSampleInt.Average(); //表示 lblAve_Func.Text = ave.ToString(); }
平均だけが欲しいときはこの処理の方がいいですね!
まとめ
今回はリスト処理においてよく使われる最大値の取得、最小値の取得、合計の算出、平均の算出を紹介しました。
リスト型の中にどれも関数が準備されていて、実は1行で終わります。
ただ関数が準備されているとはいえ、すべてを取得したいときは、準備された関数を使うのではなく、自分で書いた方がいいと考えています。それは処理短縮になると思っているからです。
それにしても、内容の大半が繰り返し分の使い方にですねw
業務でプログラミング(C#/VB/Python)を作っている。
挫折を何回も繰り返し、幾度の壁を乗り越えてきた。
乗り越えてきた事を忘れないように記録に残す。
同じ思いをしている人への情報提供になれたらと思う。
基本は初心者に向けたプログラムの情報を提供する。
コメント