bucket-sort logo bucket-sort

プログラミングとインフラエンジニアリングの覚え書き

  • Posts
  • About
  • Contact
  1. Home
  2. All Posts
  3. [C#] System.Collections.Specialized.StringCollection — 文字列専用の可変長コレクション

[C#] System.Collections.Specialized.StringCollection — 文字列専用の可変長コレクション

May 23, 2026 C# , .NET bucket-sort

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();

使いどころ

  1. Settings.settings で文字列リスト型のプロパティ を扱うとき。
  2. WinForms/WPF の古いデザイナ生成コード との互換が必要なとき。
  3. レガシー API 互換:既存ライブラリが StringCollection を要求/返却する場合。

これら以外では List<string> を選ぶのが標準です。

まとめ

  • StringCollection は string 専用に型を絞った非ジェネリックなリスト。中身は ArrayList のラッパ。
  • IList / ICollection / IEnumerable を実装。IList<string> は実装しない。
  • 性能特性は ArrayList と同じ:添字アクセス O(1)、末尾追加 O(1) 償却、任意位置挿入・削除 O(n)。
  • 新規コードでは List<string>。Settings.settings 連携などで顔を出す互換型。
C# .NET StringCollection System.Collections.Specialized コレクション
← [C#] System.Collections.Specialized.ListDictionary — 小規模辞書に特化した連結リスト実装 [C#] System.Collections.Specialized.BitVector32 — 32 ビットを構造体で扱う高効率ビットフラグ →

Related Posts

  • [C#] System.Collections.Specialized.ListDictionary — 小規模辞書に特化した連結リスト実装 May 22, 2026
  • [C#] System.Collections.Specialized.HybridDictionary — 小規模では ListDictionary、大規模では Hashtable May 21, 2026
  • [C#] System.Collections.Generic.LinkedList<T> — 双方向連結リストの仕組みと使いどころ May 26, 2026
  • [C#] System.Collections.Generic.Dictionary<TKey, TValue> — 標準ハッシュテーブルの仕組みと使いどころ May 25, 2026

Table of Contents

  • StringCollection とは
  • サポートするインターフェース
  • 主な API と計算量
  • List<string> との比較
  • Settings.settings での使われ方
  • 使いどころ
  • まとめ

Recent Posts

  • [C#] System.Collections.Generic.LinkedList<T> — 双方向連結リストの仕組みと使いどころ May 26, 2026
  • [C#] System.Collections.Generic.Dictionary<TKey, TValue> — 標準ハッシュテーブルの仕組みと使いどころ May 25, 2026
  • [C#] System.Collections.Specialized.BitVector32 — 32 ビットを構造体で扱う高効率ビットフラグ May 24, 2026
  • [C#] System.Collections.Specialized.StringCollection — 文字列専用の可変長コレクション May 23, 2026
  • [C#] System.Collections.Specialized.ListDictionary — 小規模辞書に特化した連結リスト実装 May 22, 2026

Categories

  • C#76
  • .NET75
  • AWS27
  • Laravel16
  • Linux15
  • MySQL9
  • Apache8
  • PHP8
  • DynamoDB6
  • セキュリティ6
  • Nginx5
  • WordPress4
  • インフラ4
  • Hugo3
  • .NET Framework1
  • Aurora1
  • Filament1
  • Git1
  • SQS1

Tags

  • C#
  • .NET
  • AWS
  • Laravel
  • PHP
  • セキュリティ
  • MySQL
  • コレクション
  • Linux
  • パフォーマンス
  • Apache
  • Code Snippet
  • DynamoDB
  • NoSQL
  • PHP-FPM
  • RDS
  • System.Collections
  • DoS
  • Nginx
  • Windows
  • WordPress
  • メモリ管理
  • 監視
  • 設計
  • Amazon Linux 2023
  • Docker
  • IDisposable
  • Ipset
  • Iptables
  • OPCache
  • System.Collections.Specialized
  • Webサーバー
  • オブジェクト指向
  • クラス設計
  • デザインパターン
  • パターンマッチング
  • 継承
  • 認可
  • Aurora
  • Blade
  • Grafana
  • Hugo
  • InfluxDB
  • Policy
  • Record
  • SSG
  • インターフェース
  • エラーハンドリング
  • カプセル化
  • ガベージコレクション
Powered by Hugo & Explore Theme.