【C#】List型(リスト型)をつかいこなそう #2

スポンサーリンク

人のソフトの改善/改造の時に、読み解けないのは知識不足。。。

知識不足だけなら、知識を身に着ければ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

コメント

タイトルとURLをコピーしました