System.Collections.Specialized.StringCollection は、string 専用に型を絞った可変長コレクション です。ジェネリックがなかった時代に「文字列リストくらいは型安全に扱いたい」というニーズに応えるために用意されました。Visual Studio が生成する Settings.settings で「文字列のリスト」を選ぶと、今でもこの型がプロパティの型として現れます。
StringCollection とは
- 名前空間:
System.Collections.Specialized - 内部構造:
ArrayListを内部に持ち、API レベルでstring型に固定したラッパ - すべてのメソッドが
stringを引数・戻り値に取るので キャスト不要 null要素も格納可能、重複も可
using System.Collections.Specialized;
var names = new StringCollection { "Alice", "Bob", "Charlie" };
names.Add("Dave");
names[1] = "Bobby";
foreach (string? name in names)
Console.WriteLine(name);
サポートするインターフェース
| インターフェース | 役割 |
|---|---|
IList |
添字アクセス・挿入・削除(ただし要素は string) |
ICollection |
Count / CopyTo / 同期サポート |
IEnumerable |
foreach で文字列を列挙 |
ICloneable は実装していません。
各インターフェースの詳細は次を参照してください。
IList/ICollection: ArrayList の記事IEnumerable: IEnumerable と IEnumerator の記事
StringCollection 自体は IList<string> などのジェネリックインターフェースは実装していない点に注意してください(古い世代の型なので非ジェネリックのみ)。LINQ で扱いたいときは Cast<string>() を挟みます。
foreach (var lower in names.Cast<string>().Select(s => s.ToLower()))
Console.WriteLine(lower);
主な API と計算量
API はほぼ ArrayList と同じで、引数・戻り値が string に固定されています。
| 操作 | API | 計算量 |
|---|---|---|
| 末尾追加 | Add(string) |
O(1) 償却 |
| 範囲追加 | AddRange(string[]) |
O(k) |
| 添字アクセス | this[int] |
O(1) |
| 任意位置挿入 | Insert(i, s) |
O(n) |
| 任意位置削除 | RemoveAt(i) / Remove(s) |
O(n) |
| 検索 | Contains(s) / IndexOf(s) |
O(n) |
| 列挙 | foreach |
O(n) |
文字列比較は 既定で string.Equals(オーディナル) を使います。大文字小文字を無視した比較が必要なら、外側で StringComparer.OrdinalIgnoreCase を使った検索ロジックを書くか、List<string> に切り替えるのが現代的です。
List<string> との比較
| 観点 | StringCollection |
List<string> |
|---|---|---|
| 型安全 | ◯(string 固定) |
◯ |
| LINQ 直接対応 | × Cast<string>() 必要 |
◯ |
IList<T> 実装 |
✕ | ◯ |
IReadOnlyList<T> 実装 |
✕ | ◯ |
Settings.settings 対応 |
◯ | × |
| 推奨度 | レガシー / 設定ファイル用 | 新規コードの標準 |
新規コードで文字列のリストが欲しいなら List<string> 一択。StringCollection を採用する積極的理由は、Settings.settings が要求する場合にほぼ限られます。
Settings.settings での使われ方
Visual Studio で Settings.settings を開き、設定の型に 「System.Collections.Specialized.StringCollection」 を選ぶと、自動生成されるコードが StringCollection プロパティを公開します。
// 自動生成(イメージ)
public StringCollection RecentFiles
{
get => (StringCollection)this["RecentFiles"];
set => this["RecentFiles"] = value;
}
これは設定の永続化(XML シリアライズ)の都合で、List<string> がそのまま使えなかった経緯による互換のためです。アプリケーションコード側で扱いたいときは List<string> に詰め替えるのが楽です。
var recent = Settings.Default.RecentFiles
.Cast<string>()
.ToList();
// 編集後、StringCollection に書き戻す
var sc = new StringCollection();
sc.AddRange(recent.ToArray());
Settings.Default.RecentFiles = sc;
Settings.Default.Save();
使いどころ
Settings.settingsで文字列リスト型のプロパティ を扱うとき。- WinForms/WPF の古いデザイナ生成コード との互換が必要なとき。
- レガシー API 互換:既存ライブラリが
StringCollectionを要求/返却する場合。
これら以外では List<string> を選ぶのが標準です。
まとめ
StringCollectionはstring専用に型を絞った非ジェネリックなリスト。中身はArrayListのラッパ。IList/ICollection/IEnumerableを実装。IList<string>は実装しない。- 性能特性は
ArrayListと同じ:添字アクセス O(1)、末尾追加 O(1) 償却、任意位置挿入・削除 O(n)。 - 新規コードでは
List<string>。Settings.settings連携などで顔を出す互換型。