List を模倣したようなカスタムのリストクラス ListInt


全体の模擬コード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace List12_1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ListInt lines = new ListInt();

            lines.Add(10);
            lines.Add(20);
            lines.Add(30);
            lines.Add(40);
            lines.Add(50);
            lines.Add(60);
        }
    }
}
using System;

namespace List12_1
{
    internal class ListInt
    {
        private int[] items;
        private int count;

        public ListInt()
        {
            items = new int[4];
            count = 0;
        }

        public int Count
        {
            get
            {
                return count;
            }
        }

        public void Add(int item)
        {
            if (count == items.Length)
            {
                Resize();
            }

            items[count] = item;
            count++;
        }

        private void Resize()
        {
            int[] newArray = new int[items.Length * 2];

            for (int i = 0; i < items.Length; i++)
            {
                newArray[i] = items[i];
            }

            items = newArray;

        }
    }
}

Main メソッド

内容:

  • カスタムクラス ListInt のインスタンス lines を作成します。
  • リストに 10, 20, 30, 40, 50, 60 の値を順番に追加します。
ListInt lines = new ListInt();

lines.Add(10);
lines.Add(20);
lines.Add(30);
lines.Add(40);
lines.Add(50);
lines.Add(60);

ListInt クラス

カスタムリストの設計:

  • 目的: 標準の List<int> に似た動作を実現するクラスです。
  • 主要なプロパティとメソッド:
    • private int[] items;
      実際にデータを格納するための配列。
    • private int count;
      配列に格納されている要素の数を追跡します。
    • public ListInt()
      配列を初期化するコンストラクター。
    • public int Count { get; }
      現在の要素数を取得します。
    • public void Add(int item)
      配列の末尾に新しい要素を追加します。
    • private void Resize()
      配列のサイズを拡張します。

クラスの詳細な動作

コンストラクター

public ListInt()
{
    items = new int[4];
    count = 0;
}
  • 初期状態では、items 配列を長さ 4 で作成します。
  • count を 0 に設定し、配列に何も追加されていない状態を表します。

Add メソッド

public void Add(int item)
{
    if (count == items.Length)
    {
        Resize();
    }

    items[count] = item;
    count++;
}
  1. 要素追加:
    • items 配列の count 番目に新しい要素 item を追加します。
    • count をインクリメントして、要素数を更新します。
  2. 容量のチェック:
    • 追加する際に、現在の配列が満杯 (count == items.Length) かどうかを確認します。
    • 満杯であれば Resize() を呼び出して配列を拡張します。

Resize メソッド

private void Resize()
{
    int[] newArray = new int[items.Length * 2];

    for (int i = 0; i < items.Length; i++)
    {
        newArray[i] = items[i];
    }

    items = newArray;
}
  • 動作:
    • 新しい配列 newArray を、現在の配列の 2倍の長さ で作成します。
    • 元の配列 items の要素を、新しい配列 newArray にコピーします。
    • items を新しい配列に置き換え、容量を拡張します。
    • 目的:
      配列のサイズは固定ですが、動的なリストのように動作させるため、配列のサイズを増やします。これにより、リストにより多くの要素を追加できます。

    全体の動作

    1. lines.Add(10):
      • 配列 items に要素 10 を追加。
      • count が 1 になる。
    2. lines.Add(20):
      • 配列 items に要素 20 を追加。
      • count が 2 になる。
    3. 同様に 30, 40 を追加:
      • どちらも現在の配列に収まり、count は 4 に到達。
    4. lines.Add(50):
      • count == items.Length となるため Resize() を呼び出して配列の長さを 8 に拡張。
      • 新しい配列に既存の要素をコピーし、50 を追加。
    5. lines.Add(60):
      • 配列の空きがあるので、そのまま追加。

    解説まとめ

    • ListInt クラスは、動的に要素数が増えるリストを模倣しています。
    • 配列のサイズが不足した際に、自動でサイズを拡張することで、動的リストのような動作を可能にしています。
    • 標準ライブラリの List<int> を使わず、自分でリストを設計することで、配列や動的メモリ管理の仕組みを学ぶ良い練習になります。

    C#

    Posted by hidepon