C# コレクションのチュートリアルと例

⚡ スマートサマリー

C# のコレクションは、オブジェクトのグループを格納および管理するための柔軟な方法を提供します。配列とは異なり、コレクションは実行時にサイズが増減し、System.Collections および System.Collections.Generic 名前空間には、リスト、辞書、スタック、キューなどの既製の型が用意されています。

  • 🔃 動的なサイズ調整: コレクションは実行時に要素を追加および削除するため、配列のように事前にサイズを固定する必要はありません。
  • 📚 名前空間: System.Collections には非ジェネリック型が格納され、System.Collections.Generic には型安全なジェネリック型が格納されます。
  • 🧱 コアクラス: ArrayList、Stack、Queue、Hashtable、SortedList、およびBitArrayは、一般的な非汎用的なニーズに対応します。
  • 汎用パワー: List、Dictionary、HashSet、Queueは、コンパイル時の型安全性とパフォーマンスの向上を実現します。
  • 🔑 正しい選択: キー検索には辞書を、順序付きアイテムにはリストを、LIFOまたはFIFO順序にはスタックまたはキューを使用してください。
  • 🤖 AI支援: GitHub Copilotはコレクションコードを生成し、ML.NETパイプラインは汎用的なコレクション型を通してデータを渡す。

C# のコレクション

前回のチュートリアルでは、C# で配列を使用する方法について学びました。 簡単に概要を説明します。プログラミングにおける配列は、関連するオブジェクトのセットをグループ化するために使用されます。 したがって、XNUMX つの変数名を介してアクセスできる配列または整数のセットを作成できます。

C# のコレクションとは何ですか?

コレクションは次のようなものです 配列、オブジェクトのグループを操作するためのより柔軟な方法が提供されます。

配列では、配列内の要素の数を事前に定義する必要があることに気づいたでしょう。 これは配列が宣言されたときに行う必要がありました。

ただし、コレクションの場合は、コレクションのサイズを事前に定義する必要はありません。 いつでもコレクションに要素を追加したり、コレクションから要素を削除したりできます。 この章では、C# で利用可能なさまざまなコレクションをどのように操作できるかに焦点を当てます。

System.Collections クラス

.NET Framework では、汎用ではないオリジナルのコレクション クラスが System.Collections 名前空間にまとめられています。以下の表は、すぐに使用できる主な型をまとめたものです。

収集 詳細説明
配列リスト ArrayList コレクションは Array に似ています。 C# のデータ型。 最大の違いは、配列リスト コレクションの動的な性質です。
スタック スタックは、後入れ先出し(LIFO)の概念を表す特殊なコレクションです。
キュー キューは、先入れ先出しの概念を表す特殊なケースのコレクションです。
ハッシュ表 ハッシュテーブルは、キーと値のペアを格納するために使用される特別なコレクションです。
ソートされたリスト SortedList は、デフォルトでキーと値のペアをキーの昇順で格納するコレクションです。
ビット配列 ビット配列は、ビットを格納するデータ構造の配列です。

C# の汎用コレクション

上記の非ジェネリッククラスは、すべての要素を汎用オブジェクトとして格納するため、コンパイラは型チェックを行うことができず、プログラムは値のボックス化にわずかなコストを負担します。この問題を解決するために、C# では System.Collections.Generic 名前空間が追加され、各コレクションは宣言された 1 つの型にバインドされるようになりました。

リストなどの汎用コレクション文字列のみを受け入れるため、コンパイル時にエラーが検出され、アイテムを読み込む際に型変換は不要です。これにより、ジェネリックコレクションはより安全で高速、かつ読みやすくなり、現代のC#コードではデフォルトの選択肢となっています。

最も一般的な汎用コレクションを以下に示します。

  • リスト: サイズ変更可能なインデックスベースのリストで、ArrayListの汎用的な代替品です。
  • 辞書: キーと値のペアを格納し、ハッシュベースの高速な検索機能を提供します。
  • ハッシュセット: 一意の値のみを保持し、和集合などの集合演算をサポートします。
  • 列: 先入れ先出し方式のコレクションで、キューの汎用版です。
  • スタック: 後入れ先出し方式のコレクションで、スタックの汎用版です。
  • ソート済みリスト: キーと値のペアをキーの昇順でソートして保持します。

C# リストコレクションの例

Listは動的配列のように動作するため、最も広く使用されている汎用コレクションです。以下の例では、文字列のリストを作成し、項目を追加および削除し、そのサイズを読み取り、残りの値を出力します。すべてのコードはProgram.csファイルに記述されています。

ステップ1) System.Collections.Generic 名前空間をインポートし、文字列のリストを宣言します。

ステップ2) Addメソッドでアイテムを追加し、Removeメソッドでアイテムを削除します。

ステップ3) Countプロパティを読み込み、foreach文を使ってリストをループ処理します。

using System;
using System.Collections.Generic;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   List<string> tutorials = new List<string>();
   tutorials.Add("Java");
   tutorials.Add("Python");
   tutorials.Add("Kotlin");
   tutorials.Remove("Python");
   Console.WriteLine(tutorials.Count);
   foreach (string tutorial in tutorials)
   {
    Console.WriteLine(tutorial);
   }
   Console.ReadKey();
  }
 }
}

Code 説明:-

  1. System.Collections.Generic 名前空間がインポートされるため、List 型がプログラムで使用できるようになります。
  2. 新しいリスト「tutorials」という名前のファイルが作成され、Addメソッドを使用して3つの名前が追加されます。
  3. Remove メソッドは値を削除します「Pythonこれにより、リストには2つの項目が残ります。
  4. Count プロパティはアイテムの数を返し、foreach ループは残りの値を順番に出力します。

プログラムを実行すると、まずカウントを出力します。 2、続いて Java (NAIST) と コトリン 別々の行に表示されます。これは、コレクションが実行時にサイズを変更する方法を示しています。固定配列ではこれはできません。

C#における配列とコレクションの違い

どちらも 配列 また、コレクションは関連する項目を1つの名前でグループ化しますが、プログラムの実行中はそれぞれ異なる動作をします。それぞれの適切な使用方法を理解することで、より簡潔で効率的なコードを書くことができます。

主な違いは以下のとおりです。

  • サイズ: 配列は宣言時に固定長が設定されるのに対し、コレクションはいつでも増減できる。
  • 型処理: 配列は単一の型を格納するのに対し、コレクションはジェネリクスを使用すれば型安全性を確保でき、ジェネリクスを使用しない場合は様々な型のオブジェクトを格納できる。
  • 住所 配列は言語に組み込まれていますが、コレクション クラスは System.Collections および System.Collections.Generic 名前空間に存在します。
  • 組み込みの操作: コレクションは、アイテムの追加、削除、検索、ソートを行うための便利な方法を提供する一方、配列は基本的なインデックスによるアクセスしか提供しません。
  • 最適な用途: 項目の数が既知で固定されている場合は配列を、プログラムの実行中に項目数が変化する場合はコレクションを選択してください。

つまり、配列は固定サイズのデータ​​に最適であり、コレクションはほとんどの実際のアプリケーションが必要とする柔軟性を提供する。

よくあるご質問

レコードにマッピングされたIDなど、一意のキーによる高速検索が必要な場合は、辞書を使用してください。辞書はほぼ定数時間で値を検索できますが、リストは項目を1つずつスキャンする必要があります。

HashSetとDictionaryはハッシュ化を利用してほぼ定数時間で要素にアクセスできるため、最も高速な検索を実現します。Listや配列は、すべての要素を順番にチェックする必要がある場合があるため、検索速度が遅くなります。

同時実行コレクションは System.Collections.Concurrent 名前空間に属し、マルチスレッドコード向けに設計されています。ConcurrentDictionary や BlockingCollection などの型を使用すると、複数のスレッドが手動でロックすることなく安全にアイテムを追加および削除できます。

IEnumerableは、foreachループによる項目の読み取りのみをサポートする基本インターフェースです。ICollectionはこれを拡張し、Count、Add、Removeなどのメンバーを追加することで、コレクションの変更もサポートします。

Listは汎用的で型安全なコレクションであり、宣言された単一の型を格納するため、コンパイル時のチェックが可能でパフォーマンスも優れています。一方、ArrayListは非汎用的で、各項目をオブジェクトとして格納するため、型変換が必要となり、複数の型を混在させることができます。

スタックは後入れ先出し(LIFO)方式で動作するため、ポップ操作では最新のアイテムが最初に削除されます。キューは先入れ先出し(FIFO)方式で動作するため、デキュー操作では最も古いアイテムが最初に削除されます。

はい。GitHub Copilotは、適切なコレクションタイプを提案したり、アイテムを追加またはフィルタリングするループを生成したり、短いコメントからLINQクエリを補完したりできるため、リスト、辞書、その他のコレクションの操作を高速化できます。

ML.NET は、List や IEnumerable などのコレクションを介してトレーニングデータを供給し、それらは IDataView パイプラインにマッピングされます。サンプルを厳密に型指定された汎用コレクションに格納することで、機械学習のワークフローが明確かつ型安全に保たれます。