C# 動的配列(ArrayList)
ArrayList は C# で提供される動的配列クラスの 1 つで、名前空間 System.Collections にあります。
動的配列(ArrayList)は通常の配列とは異なり、サイズを動的に調整でき、固定長を事前に定義する必要はありません。
動的配列(ArrayList)は、個別にインデックス付けできるオブジェクトの順序付きコレクションを表します。また、リスト内での動的なメモリ割り当て、追加、検索、並べ替えなどの操作を可能にします。
ArrayListこのクラスは、頻繁にサイズを調整する必要がある配列操作に適していますが、非ジェネリックであるため、現代の C# 開発では徐々にList<T>置き換えられています。
基本構造
public class ArrayList : ICollection, IEnumerable, IList, ICloneable
実装インターフェース:
- 実装インターフェース:
IList:インデックスによる要素へのアクセスをサポートします。ICollection:追加、削除、カウントなどのコレクションの基本操作をサポートします。IEnumerable:列挙子を使用した要素の反復処理をサポートします。ICloneable:クローンをサポートします。ArrayList。
特徴
動的拡張:
ArrayListの容量は必要に応じて自動的に調整でき、固定サイズを指定する必要はありません。- 追加された要素が現在の容量を超えると、
ArrayListは自動的に容量を増やします(通常は元の容量の 2 倍)。
非ジェネリックコレクション:
ArrayListは非ジェネリックコレクションであり、すべての要素はobject型として格納されます。つまり、任意の型のオブジェクトを格納できますが、ボックス化(boxing)とボックス化解除(unboxing)のパフォーマンスへの影響に注意する必要があります。
順序なし操作:
- 要素の格納順序は追加順序と一致しますが、組み込みの並べ替え機能は提供されません。
スレッドセーフ:
- デフォルトではスレッドセーフではありません。スレッドセーフな
ArrayListが必要な場合は、ArrayList.Synchronizedメソッドを使用してスレッドセーフなバージョンを生成できます。
ArrayList クラスのメソッドとプロパティ
次の表は、ArrayListクラスの一般的なプロパティを一覧表示しています。:
| プロパティ名 | 型 | 説明 |
|---|---|---|
Count | int | ArrayList に含まれる要素の数をArrayList取得します。 |
Capacity | int | ArrayList の容量(格納スペース)をArrayList取得または設定します。 |
IsFixedSize | bool | ArrayList が固定サイズかどうかをArrayList示します。 |
IsReadOnly | bool | ArrayList が読み取り専用かどうかをArrayList示します。 |
IsSynchronized | bool | ArrayList がスレッドセーフかどうかをArrayList示します。 |
SyncRoot | object | 同期アクセスに使用できるオブジェクトを取得します。 |
次の表は、ArrayListクラスの一般的なメソッドを一覧表示しています。:
| メソッド名 | 戻り値の型 | 説明 |
|---|---|---|
| 追加と挿入 | ||
Add(object value) | int | オブジェクトを ArrayList のArrayList末尾に追加し、新しい要素のインデックスを返します。 |
AddRange(ICollection c) | void | 指定したコレクションのすべての要素を ArrayList のArrayList末尾に追加します。 |
Insert(int index, object value) | void | 指定したインデックス位置にオブジェクトを挿入します。 |
InsertRange(int index, ICollection c) | void | 指定したインデックス位置に、指定したコレクションのすべての要素を挿入します。 |
| 削除 | ||
Remove(object value) | void | 指定したオブジェクトのうち、最初に出現したものを削除します。 |
RemoveAt(int index) | void | 指定したインデックス位置にある要素を削除します。 |
RemoveRange(int index, int count) | void | 指定したインデックスから始まる指定数の要素を削除します。 |
Clear() | void | すべての要素を削除します。 |
| アクセスと検索 | ||
Contains(object item) | bool | ArrayList に指定したオブジェクトが含まれているかどうかをArrayList判定します。 |
IndexOf(object value) | int | 指定したオブジェクトが最初に出現するインデックスを取得します。 |
LastIndexOf(object value) | int | 指定したオブジェクトが最後に出現するインデックスを取得します。 |
| 並べ替えとコピー | ||
Sort() | void | ArrayList 内の要素をデフォルトの順序でArrayList並べ替えます。 |
Sort(IComparer comparer) | void | カスタム比較子に従って並べ替えます。 |
Reverse() | void | ArrayList 内の要素の順序をArrayList反転します。 |
CopyTo(Array array) | void | 将 ArrayListの要素を指定した配列にコピーします。 |
| その他 | ||
GetRange(int index, int count) | ArrayList | 指定したインデックスから始まる指定数の要素のサブセットを取得します。 |
ToArray() | object[] | 将 ArrayList内の要素を配列にコピーします。 |
TrimToSize() | void | 実際の要素数に合わせて容量を調整し、メモリを節約します。 |
例
次の例は、動的配列(ArrayList)の概念を示しています:
例
using System;
using System.Collections;
namespace CollectionApplication
{
class Program
{
static void Main(string[] args)
{
// 動的配列を作成して初期化
ArrayList numbers = InitializeArrayList();
// 配列の容量と要素数を表示
DisplayArrayListInfo(numbers);
// 配列の内容を表示
Console.Write("Original Content: ");
DisplayArrayListContent(numbers);
// 配列の内容を並べ替える
numbers.Sort();
// 並べ替え後の内容を表示
Console.Write("Sorted Content: ");
DisplayArrayListContent(numbers);
Console.ReadKey(); // ユーザーのキー入力を待って終了
}
/// <summary>
/// ArrayList を初期化してデータを設定する
/// </summary>
/// <returns>初期データを含む ArrayList</returns>
static ArrayList InitializeArrayList()
{
ArrayList al = new ArrayList();
Console.WriteLine("Adding numbers to the ArrayList:");
// 初期要素を追加
int[] initialNumbers = { 45, 78, 33, 56, 12, 23, 9 };
foreach (int num in initialNumbers)
{
al.Add(num);
Console.WriteLine($"Added: {num}");
}
return al;
}
/// <summary>
/// ArrayList の容量と要素数を表示する
/// </summary>
/// <param name="al">ArrayList オブジェクト</param>
static void DisplayArrayListInfo(ArrayList al)
{
Console.WriteLine($"\nCapacity: {al.Capacity}"); // 現在の容量
Console.WriteLine($"Count: {al.Count}"); // 現在の要素数
}
/// <summary>
/// ArrayList の内容を表示する
/// </summary>
/// <param name="al">ArrayList オブジェクト</param>
static void DisplayArrayListContent(ArrayList al)
{
foreach (int num in al)
{
Console.Write(num + " ");
}
Console.WriteLine(); // 改行
}
}
}
using System.Collections;
namespace CollectionApplication
{
class Program
{
static void Main(string[] args)
{
// 動的配列を作成して初期化
ArrayList numbers = InitializeArrayList();
// 配列の容量と要素数を表示
DisplayArrayListInfo(numbers);
// 配列の内容を表示
Console.Write("Original Content: ");
DisplayArrayListContent(numbers);
// 配列の内容を並べ替える
numbers.Sort();
// 並べ替え後の内容を表示
Console.Write("Sorted Content: ");
DisplayArrayListContent(numbers);
Console.ReadKey(); // ユーザーのキー入力を待って終了
}
/// <summary>
/// ArrayList を初期化してデータを設定する
/// </summary>
/// <returns>初期データを含む ArrayList</returns>
static ArrayList InitializeArrayList()
{
ArrayList al = new ArrayList();
Console.WriteLine("Adding numbers to the ArrayList:");
// 初期要素を追加
int[] initialNumbers = { 45, 78, 33, 56, 12, 23, 9 };
foreach (int num in initialNumbers)
{
al.Add(num);
Console.WriteLine($"Added: {num}");
}
return al;
}
/// <summary>
/// ArrayList の容量と要素数を表示する
/// </summary>
/// <param name="al">ArrayList オブジェクト</param>
static void DisplayArrayListInfo(ArrayList al)
{
Console.WriteLine($"\nCapacity: {al.Capacity}"); // 現在の容量
Console.WriteLine($"Count: {al.Count}"); // 現在の要素数
}
/// <summary>
/// ArrayList の内容を表示する
/// </summary>
/// <param name="al">ArrayList オブジェクト</param>
static void DisplayArrayListContent(ArrayList al)
{
foreach (int num in al)
{
Console.Write(num + " ");
}
Console.WriteLine(); // 改行
}
}
}
上記のコードをコンパイルして実行すると、次の結果が生成されます:
Adding numbers to the ArrayList: Added: 45 Added: 78 Added: 33 Added: 56 Added: 12 Added: 23 Added: 9 Capacity: 16 Count: 7 Original Content: 45 78 33 56 12 23 9 Sorted Content: 9 12 23 33 45 56 78
ジェネリックコレクションとのList<T>比較
| 特性 | ArrayList | List<T> |
|---|---|---|
| 型安全性 | いいえ(object 型としてobject格納) | はい(ジェネリック、強い型制約) |
| ボックス化とボックス化解除 | はい(値型の場合必要) | 否 |
| パフォーマンス | 低い | 高い |
| ジェネリックのサポート | 无 | 有 |
| 使用シナリオ | レガシーコードまたは単純なシナリオ | 現代の開発では優先的に選択される |
注意事項
頻繁なボックス化とボックス化解除を避ける:
- データが主に値型の場合は、
List<T>List<T> を使用して、パフォーマンスのオーバーヘッドを回避することをお勧めします。
混在型データの使用には注意する:
- 異なる型のオブジェクトを混在して格納しないようにし、実行時エラーのリスクを低減します。
代替案:
- 現代の C# 開発では、ジェネリックコレクション(例:
List<T>、Dictionary<TKey, TValue>List<T>)を使用して、コードの安全性と効率を高めることをお勧めします。