コレクション
ジェネリックコレクション
配列のように複数のデータを扱えるようにしたクラスを,コレクション (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 命令 | 説明 |
---|---|---|
Where | WHERE | 条件によって絞り込む |
OrderBy | ORDERBY | 要素を並べ替える |
Select | SELECT | 出力する属性を指定する |
標準クエリ演算子の中には,p => p.Age < 40 のように,ラムダ式を引数に取るものがあります。
ラムダ式 p => p.Age < 40 は,次のメソッドを指すデリゲートに相当します。
bool Method(Person p)
{
return p.Age < 40;
}