PR

[C#] ジェネリックコレクションについて

コレクションはデータ(オブジェクト)の集まりのことです。
データを複数まとめて扱うことができます。

同じ型のコレクションの場合はジェネリックコレクションを使います。
データの追加のときに同じ型しか指定できないため、要素に応じて型を調べて変換する必要がなくなります。
C#は型の指定にきびしいですね。

配列も同じように複数のデータを扱うことができますが、配列はあらかじめ要素の数が決まっている場合に使用します。

コレクションは要素の追加、削除を簡単に行うことができます。
また、LINQと組み合わせてデータを加工して取り出したり、条件を指定して要素を絞って取り出したりすることができます。
LINQについては別記事で紹介します。

スポンサーリンク

ジェネリックとは?

くわしくは別記事で紹介しようと思っていますが、ジェネリック(Generic)を使うと複数のデータ型に対応したメソッドやクラスを作ることができます。
ジェネリックメソッドジェネリッククラスと言います。

データの型をパラメーターとしてもらい、型が違っても同じ処理を行う、ということができるようになります。

ジェネリックコレクションはパラメーターで受け取った型の要素を追加、削除できるようになっています。

あとで紹介しますが、リスト(List)クラスを宣言、初期化する際に型をパラメーターとして指定しています。

スポンサーリンク

ジェネリックコレクションの種類

コレクションはSystem.Collections.Generic名前空間に定義されています。
用途によって使い分けを行います。

最初のうちはよく使うListDictionaryを覚えれば十分だと思います。
各コレクションの詳しい使い方は別記事で紹介予定です。

リスト(List)

配列に要素の追加、削除機能を追加したようなコレクションです。
要素の順番に意味がある場合に使います。

各要素へのアクセスは配列と同じように添え字(インデックス)を使用します。
foreachを使って各要素を順番に取り出すこともできます。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        // リストの初期化(int型のコレクション)
        var list = new List<int>();
        // リストに要素を追加
        list.Add(10);
        list.Add(20);
        list.Add(30);
        list.Add(10);

        // 添え字を使ってリストの要素にアクセス
        Console.WriteLine(list[1]); // 20

        // foreachを使って全要素を反復
        foreach (var i in list) Console.WriteLine(i);
    }
}

出力結果はこんな感じです。

20
10
20
30
10

Listの詳しい使い方についてはこちら、

[C#] リスト(List)の使い方まとめ
C#のリスト(List)の使い方のまとめです。初期化や要素の追加・削除の方法、インデックスを使って要素を取得・変更する方法、foreachを使って各要素を順番に取得する方法についてのまとめになります。

ハッシュセット(HashSet)

リストと似たようなコレクションですが、こちらはデータの順番が保証されません。
要素の有無に意味があります。
そのため、重複する要素は一つにまとめられます。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        // ハッシュセットの初期化(string型のコレクション)
        var hash = new HashSet<string>();
        // 要素を追加
        hash.Add("a");
        hash.Add("b");
        hash.Add("c");
        hash.Add("a");
        // 各要素を表示
        foreach (var h in hash) Console.WriteLine(h);
    }
}

出力結果はこんな感じです。重複したaは1つになっています。

a
b
c

ディクショナリー(Dictionary)

キーのペアのコレクションです。
値を取得するためにキーを使用して要素へアクセスします。
そのため、キーはコレクション内で重複しないように指定する必要があります。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        // ディクショナリーの初期化(キーはstring型、値はint型)
        var dic = new Dictionary<string, int>();
        // 追加
        dic.Add("height", 191);
        dic.Add("weight", 107);
        // キーを使って値を取得
        Console.WriteLine(dic["weight"]);  // 107
    }
}

Dictionaryの詳しい使い方はこちら、

[C#] ディクショナリー(Dictionary)の使い方まとめ
C#のディクショナリー(Dictionary)の使い方についての記事です。宣言、初期化や要素(キーと値)を追加・削除する方法、キーを使って値を取得・変更する方法、foreachを使って各要素にアクセスする方法についてまとめてあります。

キュー(Queue)

Queue先入れ先出し(FIFO)で要素を使用する時に使うコレクションです。
Enqueueメソッドで要素を追加し、Dequeueメソッドで要素を取り出します。
取り出した要素はキューから削除されます。
削除したくない場合はPeekメソッドを使います。

using System;
using System.Collections.Generic;
class Program
{
    public static void Main()
    {
        // Queue
        Queue<int> que = new Queue<int>();
        // 要素を追加
        que.Enqueue(1);
        que.Enqueue(2);
        que.Enqueue(3);
        // 各要素を表示
        Console.WriteLine($"要素数={que.Count}");
        foreach (var q in que) Console.WriteLine(q);
        
        Console.WriteLine($"---------------------------------");
        Console.WriteLine($"Peedメソッドは先頭の要素を取り出す(削除はしない)");
        Console.WriteLine($"Peek() = {que.Peek()}");
        Console.WriteLine($"要素数={que.Count}");

        Console.WriteLine($"---------------------------------");
        Console.WriteLine($"Dequeueメソッドは先頭の要素を取り出して削除する");
        Console.WriteLine($"Dequeue() = {que.Dequeue()}");
        Console.WriteLine($"要素数={que.Count}");
        Console.WriteLine($"Dequeue() = {que.Dequeue()}");
        Console.WriteLine($"要素数={que.Count}");
    }
}
要素数=3
1
2
3
---------------------------------
Peedメソッドは先頭の要素を取り出す(削除はしない)
Peek() = 1
要素数=3
---------------------------------
Dequeueメソッドは先頭の要素を取り出して削除する
Dequeue() = 1
要素数=2
Dequeue() = 2
要素数=1

スタック(Stack)

Stack後入れ先出し(LIFO)で要素を使用する時に使うコレクションです。
Pushメソッドで要素をを追加し、Popメソッドで要素を取り出します。
取り出した要素はキューから削除されます。
削除したくない場合はPeekメソッドを使います。

using System;
using System.Collections.Generic;
class Program
{
    public static void Main()
    {
        // スタックを作成
        Stack<int> st = new Stack<int>();
        // 要素の追加
        st.Push(1);
        st.Push(2);
        st.Push(3);

        // 各要素を表示
        foreach (var i in st) Console.WriteLine(i);

        Console.WriteLine($"---------------------------------");
        Console.WriteLine($"Peedメソッドは末尾の要素を取り出す(削除はしない)");
        Console.WriteLine($"Peek() = {st.Peek()}");
        Console.WriteLine($"要素数={st.Count}");

        // スタックは最後に追加した要素から取り出す
        Console.WriteLine($"---------------------------------");
        Console.WriteLine($"Popメソッドは先頭の要素を取り出して削除する");
        Console.WriteLine($"Pop() = {st.Pop()}");
        Console.WriteLine($"要素数={st.Count}");
        Console.WriteLine($"Pop() = {st.Pop()}");
        Console.WriteLine($"要素数={st.Count}");
    }
}
3
2
1
---------------------------------
Peedメソッドは末尾の要素を取り出す(削除はしない)
Peek() = 3
要素数=3
---------------------------------
Popメソッドは先頭の要素を取り出して削除する
Pop() = 3
要素数=2
Pop() = 2
要素数=1

C# 記事まとめページに戻る(他のサンプルコードもこちら)

C# プログラミング講座
C#についての記事まとめページです。開発環境VisualStudioのインストール方法や使い方、プログラミングの基礎知識についてや用語説明の記事一覧になっています。講座の記事にはすぐに実行できるようにサンプルコードを載せています。

コメント