C#でArrayList全体の列挙子(IEnumerator)を取得する方法
C#でArrayList全体の列挙子を取得するには、GetEnumerator()メソッドを使用します。このメソッドは、コレクション内のすべての要素を順番に反復処理できるIEnumeratorインターフェースのオブジェクトを返します。
GetEnumerator()メソッドの仕組み
GetEnumerator()が返す列挙子は、以下のメンバーを持っています。
- MoveNext():列挙子を次の要素へ進めます。次の要素が存在すればtrue、コレクションの末尾に達するとfalseを返します。
- Current:現在の位置にある要素を取得します。
- Reset():列挙子を初期位置(最初の要素の前)に戻します。
whileループと組み合わせてMoveNext()とCurrentを使うことで、foreach文と同様に全要素へアクセスできます。
サンプルコード1:文字列のArrayListを列挙子で反復処理する
using System;
using System.Collections;
public class Demo {
public static void Main(String[] args) {
ArrayList list1 = new ArrayList();
list1.Add("A");
list1.Add("B");
list1.Add("C");
list1.Add("D");
list1.Add("E");
list1.Add("F");
list1.Add("G");
list1.Add("H");
list1.Add("I");
Console.WriteLine("ArrayList1 の要素...");
foreach (string res in list1) {
Console.WriteLine(res);
}
ArrayList list2 = new ArrayList();
list2.Add("A");
list2.Add("B");
list2.Add("C");
list2.Add("D");
list2.Add("E");
list2.Add("F");
list2.Add("G");
list2.Add("H");
list2.Add("I");
Console.WriteLine("ArrayList2 の要素...");
foreach (string res in list2) {
Console.WriteLine(res);
}
Console.WriteLine("ArrayList2 の要素数 = " + list2.Count);
list2.RemoveAt(5);
Console.WriteLine("ArrayList2 の要素数(更新後)= " + list2.Count);
Console.WriteLine("列挙子でArrayList2を反復処理...");
IEnumerator demoEnum = list2.GetEnumerator();
while (demoEnum.MoveNext()) {
Console.WriteLine(demoEnum.Current);
}
}
}実行結果
上記のコードを実行すると、次の出力が得られます。
ArrayList1 の要素... A B C D E F G H I ArrayList2 の要素... A B C D E F G H I ArrayList2 の要素数 = 9 ArrayList2 の要素数(更新後)= 8 列挙子でArrayList2を反復処理... A B C D E G H I
RemoveAt(5)でインデックス5の要素「F」が削除されているため、列挙子による反復結果には「F」が含まれていない点に注目してください。
サンプルコード2:整数のArrayListを列挙子で反復処理する
続いて、整数値を格納したArrayListを列挙子で反復処理する例を見てみましょう。
using System;
using System.Collections;
public class Demo {
public static void Main() {
ArrayList arrList = new ArrayList();
arrList.Add(100);
arrList.Add(200);
arrList.Add(300);
arrList.Add(400);
arrList.Add(500);
Console.WriteLine("列挙子でArrayListを反復処理...");
IEnumerator demoEnum = arrList.GetEnumerator();
while (demoEnum.MoveNext()) {
Console.WriteLine(demoEnum.Current);
}
}
}実行結果
上記のコードを実行すると、次の出力が得られます。
列挙子でArrayListを反復処理... 100 200 300 400 500
注意点
- 列挙子は読み取り専用であり、コレクション自体の変更(要素の追加・削除)には使用できません。
- 列挙中にコレクションの構造が変更されると、列挙子は無効になりInvalidOperationExceptionがスローされます。
- 単純に全要素を読むだけであれば、foreach文の方が簡潔に記述できます。列挙子を直接扱うのは、反復処理を細かく制御したい場合に有効です。
- 新規開発では、型安全なList<T>の使用が推奨されています。ArrayListは非ジェネリックのため、要素のボックス化やキャストが必要になる点に留意してください。
-
C#でArrayListの読み取り専用ラッパーを作成する方法
ArrayListの読み取り専用ラッパーを作成するには、ArrayList.ReadOnly()メソッドを使用します。このメソッドは、元のコレクションへの変更を防ぐ読み取り専用のラッパーを返します。まずは基本的な例を見てみましょう。例1:通常のArrayListの動作確認using System; using System.Collections; public class Demo { public static void Main(){ ArrayList list = new ArrayList(); list.Add(One); list.A
-
C#のArrayListクラスにおけるCapacityプロパティとは?使い方を解説
ArrayListクラスのCapacityプロパティは、そのArrayListが格納できる要素の数を取得または設定するためのプロパティです。Capacity(容量)は、実際に格納されている要素数を表すCount(カウント)よりも常に大きいか等しい値になります。Capacityプロパティへのアクセスは以下のように記述します。arrList.Capacity容量の仕組みArrayListの既定の容量は4です。要素を追加していき、既定の容量を超えると、容量は自動的に2倍に拡張されます。例えば、5つの要素を追加した場合、容量は8に拡張されます。以降も同様に、容量を超えた時点で順次2倍ずつ拡張されていき