コレクション

スポンサーリンク

ジェネリックコレクション

配列のように複数のデータを扱えるようにしたクラスを,コレクション (collection) といいます。

System.Collections.Generic 名前空間には,次のようなコレクションが定義されています。

コレクション説明
List<T>リスト (最も基本的なコレクション)
Dictionary<TKey, TValue>ディクショナリ (キー付きコレクション)
Stack<T>スタック (後入れ先出しコレクション)
Queue<T>キュー (先入れ先出しコレクション)

型パラメータ T を持つこれらのコレクションは,ジェネリックコレクション (generic collection) と呼ばれます。
型パラメータ T には,リストに格納する要素の型を指定します。

次のプログラムは,最も基本的なコレクションである List<T> を扱ったプログラムです。

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<string> list = new List<string>();

        list.Add("aaa");    // "aaa" を追加
        list.Add("bbb");    // "bbb" を追加

        // "ccc", "ddd", "eee" を一気に追加
        list.AddRange(new string[] { "ccc", "ddd", "eee" });

        list.Remove("ddd");  // "ddd" を削除

        for (int i = 0; i < list.Count; i++)
        {
            Console.WriteLine(list[i]);
        }
    }
}
aaa
bbb
ccc
eee

List クラスは次のようなメンバを持ちます。また,インデクサも利用できます。

System.Collections.Generic 名前空間
List<T> クラス [MSDN]

プロパティ説明
Count要素数

メソッド説明
Add要素を追加する
AddRange複数の要素を追加する
Remove指定した要素を削除する
RemoveAt指定したインデックスの要素を削除する
Cleanすべての要素を削除する

コレクションの要素数は Count プロパティで取得できます。
配列はサイズが固定だから Length, コレクションはサイズが可変だから Count とのこと。

IEnumerable インタフェース

コレクションクラスで foreach 文が使えるようにするには,IEnumerable (または IEnumerable<T>) インタフェースを実装するのが 1 つの方法です。
実際,List<T> 等のジェネリックコレクションクラスは IEnumerable<T> を実装しています。

IEnumerable インタフェースには,次の GetEnumerator メソッドが含まれます。

IEnumerator GetEnumerator()

次のプログラムは,整数のスタックを表す Stack クラスを定義したものです。
IEnumerable インタフェースを実装しており,foreach 文が利用できます。

using System;
using System.Collections;

class Stack : IEnumerable
{
    private int[] stack = new int[256];
    private int index = 0;

    public void Push(int item) { stack[index++] = item; }
    public int Pop() { return stack[--index]; }

    // GetEnumerator メソッドを実装
    public IEnumerator GetEnumerator()
    {
        for (int i = 0; i < index; i++)
            yield return stack[i];
    }
}

class Program
{
    static void Main()
    {
        Stack stack = new Stack();
        stack.Push(123);
        stack.Push(456);

        foreach (int n in stack)
            Console.WriteLine(n);
    }
}
123
456

yield return 文は,返すべきコレクションの要素を 1 つずつ指定するために用いられます。
yield return 文が含まれるメソッドの返却型は,IEnumerator または IEnumerable でなければなりません。

LINQ

コレクションや配列の要素の並べ替えや抽出が簡単に行える LINQ という仕組みがあります。

using System;
using System.Linq;

// 人間を表す
class Person
{
    public string Name;  // 名前
    public int Age;      // 年齢

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class Program
{
    static void Main()
    {
        Person[] list = new Person[5];
        list[0] = new Person("長野", 43);
        list[1] = new Person("松川", 26);
        list[2] = new Person("飯田", 33);
        list[3] = new Person("大島", 24);
        list[4] = new Person("片桐", 47);

        var names = 
            from p in list
            where p.Age < 40  // 40 歳未満に絞り込み
            orderby p.Age     // 年齢で並べ替え
            select p.Name;    // 名前のみを抽出

        foreach (var name in names)
            Console.WriteLine(name);
    }
}
大島
松川
飯田

この処理は,メソッド呼び出しの形で次のように書くこともできます。

        var names = 
            list.Where(p => p.Age < 40)  // 40 歳未満に絞り込み
                .OrderBy(p => p.Age)     // 年齢で並べ替え
                .Select(p => p.Name);    // 名前のみを抽出

LINQ で利用可能な Where, OrderBy, Select といったメソッドは,標準クエリ演算子と呼ばれます。

標準クエリ演算子対応する SQL 命令説明
WhereWHERE条件によって絞り込む
OrderByORDERBY要素を並べ替える
SelectSELECT出力する属性を指定する

標準クエリ演算子の中には,p => p.Age < 40 のように,ラムダ式を引数に取るものがあります。
ラムダ式 p => p.Age < 40 は,次のメソッドを指すデリゲートに相当します。

bool Method(Person p)
{
    return p.Age < 40;
}
スポンサーリンク