未分類

C# foreach でコレクションが扱えるクラスを作成する

準備

(なし)

デザイン

1. フォーム (Form1) にボタン (button1) を配置します。
2. フォーム (Form1) にリストボックス (listBox1) を配置します。

サンプルコード (C#)

// 名前空間の追加
using System.Collections;

// クラスの定義
public class TestClass1 : IEnumerable<string>
{
  private string[] sData;
  public int length;
  
  public TestClass1()
  {
    sData = new string[0];
  }
  
  public void Add(string s1)
  {
    Array.Resize<string>(ref sData, sData.Length + 1);
    sData[sData.Length - 1] = s1;
    this.length = sData.Length;
  }
  
  public string this[int index]
  {
    get { return sData[index]; }
  }
  
  public IEnumerator<string> GetEnumerator()
  {
    foreach (string s in sData)
    {
      yield return s;
    }
  }
  
  IEnumerator IEnumerable.GetEnumerator()
  {
    throw null;
  }
}

// コード
private void button1_Click(object sender, EventArgs e)
{
  TestClass1 tc1 = new TestClass1();
  tc1.Add("NEC");
  tc1.Add("SONY");
  tc1.Add("DELL");
  
  foreach (string item in tc1)
  {
    listBox1.Items.Add(item);
  }
}

解説

TestClass1 はコレクションとインデクサの機能を扱えるように作成しています。内部的には、Add メソッドを実行するごとに内部の string 型配列に文字列データを蓄積していきます。

蓄積したデータの取り出しは、get アクセサによって行われます。この際にインデックス番号を指定すると、対応する配列の要素を返します。この機能を利用することによって、インデクサを実現しています。

結果

動作確認環境

Visual Studio 2015 Professional (C# 6.0)

-未分類