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++;
}
- 要素追加:
items配列のcount番目に新しい要素itemを追加します。countをインクリメントして、要素数を更新します。
 - 容量のチェック:
- 追加する際に、現在の配列が満杯 (
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を新しい配列に置き換え、容量を拡張します。
 - 新しい配列 
 
- 目的:
配列のサイズは固定ですが、動的なリストのように動作させるため、配列のサイズを増やします。これにより、リストにより多くの要素を追加できます。 
全体の動作
lines.Add(10):- 配列 
itemsに要素10を追加。 countが 1 になる。
- 配列 
 lines.Add(20):- 配列 
itemsに要素20を追加。 countが 2 になる。
- 配列 
 - 同様に 30, 40 を追加:
- どちらも現在の配列に収まり、
countは 4 に到達。 
 - どちらも現在の配列に収まり、
 lines.Add(50):count == items.LengthとなるためResize()を呼び出して配列の長さを 8 に拡張。- 新しい配列に既存の要素をコピーし、
50を追加。 
lines.Add(60):- 配列の空きがあるので、そのまま追加。
 
解説まとめ
ListIntクラスは、動的に要素数が増えるリストを模倣しています。- 配列のサイズが不足した際に、自動でサイズを拡張することで、動的リストのような動作を可能にしています。
 - 標準ライブラリの 
List<int>を使わず、自分でリストを設計することで、配列や動的メモリ管理の仕組みを学ぶ良い練習になります。 
訪問数 36 回, 今日の訪問数 1回






ディスカッション
コメント一覧
まだ、コメントがありません