Collection<T>クラス

ジェネリック コレクションの基本クラスです。

Collection<int> collection = new Collection<int>();

collection.Add(1);
collection.Add(2);
collection.Add(3);

実装しているインターフェイス

[System.Runtime.InteropServices.ComVisible(false)]
[System.Serializable]
public class Collection<T> :
    System.Collections.Generic.ICollection<T>,
    System.Collections.Generic.IEnumerable<T>,
    System.Collections.Generic.IList<T>,
    System.Collections.Generic.IReadOnlyCollection<T>,
    System.Collections.Generic.IReadOnlyList<T>,
    System.Collections.IList

コンストラクタ

Collection<T>()

public Collection ();
Collection<T>() - Collection<T> コンストラクター (System.Collections.ObjectModel) | Microsoft Learn

内部ではList<T>が作成されます。Collection - collection.cs

public Collection() {
    items = new List<T>();
}

Collection<T>(IList<T>)

public Collection (System.Collections.Generic.IList<T> list);
Collection<T>(IList<T>) - Collection<T> コンストラクター (System.Collections.ObjectModel) | Microsoft Learn

listの要素はコピーされません。Collection - collection.cs

listはコレクションによってラップされるだけのため、listへの操作はコレクションに影響します。このコンストラクタの計算量は、O(1)です。

int[] array = new[] { 1, 2, 3 };
List<int> list = new List<int> { 1, 2, 3 };

Collection<int> collection1 = new Collection<int>(array);
Collection<int> collection2 = new Collection<int>(list);

array[0] = 10;
list[0] = 20;

int r1 = collection1[0]; // 10
int r2 = collection2[0]; // 20

collection1[0] = 5; // NotSupportedException「コレクションは読み取り専用です。」
collection2[0] = 5; // ok

プロパティ

プロパティ 内容
int Count 要素の数
T Item[Int32] 指定のインデックスにある要素

メソッド

メソッド 機能
Add(T) 末尾にオブジェクトを追加できる
Remove(T) 最初に見つかったオブジェクトを削除できる。削除できたときにはtrueが、それ以外はfalseが返される。オブジェクトが見つからないときもfalseが返される。
RemoveAt(Int32) 指定のインデックスにある要素を削除できる
Clear() すべての要素を削除できる
Insert(Int32, T) 指定のインデックスに要素を挿入できる
Contains(T) オブジェクトがコレクション内に存在するかわかる
IndexOf(T) 最初に見つかったオブジェクトのインデックスを得られる
   
メソッド - Collection<T> クラス (System.Collections.ObjectModel) | Microsoft Learn

Add(T)

public void Add (T item);
Collection<T>.Add(T) メソッド (System.Collections.ObjectModel) | Microsoft Learn

このメソッドの計算量はO(1)です。

List<T>.Add(T)より低速です。

int MAX = 100 * 1000 * 1000;
Stopwatch sw = new Stopwatch();

Collection<int> collection = new Collection<int>();
sw.Restart();
for (int i = 0; i < MAX; i++) collection.Add(1);
Console.WriteLine(sw.ElapsedMilliseconds); // 998


// List<T>で追加した場合
List<int> list1 = new List<int>();
sw.Restart();
for (int i = 0; i < MAX; i++) list1.Add(1);
Console.WriteLine(sw.ElapsedMilliseconds); // 492

// ... 初期容量を指定した場合
List<int> list2 = new List<int>(MAX);
sw.Restart();
for (int i = 0; i < MAX; i++) list2.Add(1);
Console.WriteLine(sw.ElapsedMilliseconds); // 289


// 配列で作成し、値を設定した場合
int[] array = new int[MAX];
sw.Restart();
for (int i = 0; i < MAX; i++) array[i] = 1;
Console.WriteLine(sw.ElapsedMilliseconds); // 151

IndexOf(T)

public int IndexOf (T item);
Collection<T>.IndexOf(T) メソッド (System.Collections.ObjectModel) | Microsoft Learn

等しいことは、T型のEqualityComparer<T>.Defaultで決定されます。

拡張メソッド

メソッド 機能
ToArray<TSource>(IEnumerable<TSource>) 配列を作成できる
   
拡張メソッド - Collection<T> クラス (System.Collections.ObjectModel) | Microsoft Learn
Microsoft Learnから検索