ジェネリック・クラスで変わるC#とVBのコレクション:特集C#&VBジェネリック超入門(前編)(4/4 ページ)
この新機能を使えばコレクション・クラスの利用が安全かつ効率的に! ちょっと難しいC# 2.0やVB 2005の「ジェネリック」を丁寧に解説。
Hashtableクラスを置き換えるDictionaryジェネリック・クラス
リストに次いでよく使われるコレクションにハッシュテーブルがあります。
ハッシュテーブルを実装したクラスとしてはHashtableクラスが用意されていましたが、そのジェネリック版としてDictionaryジェネリック・クラスが新しく追加されました。
ハッシュテーブルはコレクションの要素として「キー」と「値」のペアを格納します。このため、Dictionaryジェネリック・クラスは次のように2つの型パラメータを持っており、インスタンス作成時には、それぞれに型を指定することができます。
- C#の場合: Dictionary<TKey, TValue>クラス
- VBの場合: Dictionary(Of TKey, TValue)クラス
以下のサンプル・プログラムは、キーも値も文字列の場合の例です。
using System;
using System.Collections.Generic;
class GenericSample {
void Sample() {
// Dictionary<TKey, TValue>クラスのインスタンス化
Dictionary<string, string> myDict
= new Dictionary<string, string>();
// 要素の追加
myDict.Add("hello", "こんにちわ");
myDict.Add("goodby", "さようなら");
// インデクサによる値の取得
string ans = myDict["hello"];
Console.WriteLine(ans);
// 出力:こんにちわ
// 各要素の列挙
foreach (KeyValuePair<string, string> kv in myDict) {
Console.WriteLine("{0}:{1}", kv.Key, kv.Value);
}
// 出力:
// hello:こんにちわ
// goodby:さようなら
}
static void Main() {
GenericSample gs = new GenericSample();
gs.Sample();
}
}
Imports System
Imports System.Collections.Generic
Class GenericSample
Sub Sample()
' Dictionary(Of TKey, TValue)クラスのインスタンス化
Dim myDict As New Dictionary(Of String, String)
' 要素の追加
myDict.Add("hello", "こんにちわ")
myDict.Add("goodby", "さようなら")
' インデクサによる値の取得
Dim ans As String = myDict("hello")
Console.WriteLine(ans)
' 出力:こんにちわ
' 各要素の列挙
For Each kv As KeyValuePair(Of String, String) In myDict
Console.WriteLine("{0}:{1}", kv.Key, kv.Value)
Next
' 出力:
' hello:こんにちわ
' goodby:さようなら
End Sub
End Class
Module Module1
Sub Main()
Dim gs As New GenericSample
gs.Sample()
End Sub
End Module
このプログラムの「各要素の列挙」部分では、コレクションから要素を1つずつ順に取り出し、そのキーと値の内容を表示しています。
Dictionaryジェネリック・クラスが管理する各要素は、これまた新しく追加されたKeyValuePairジェネリック構造体により表されます。
- C#の場合: KeyValuePair<TKey, TValue>クラス
- VBの場合: KeyValuePair(Of TKey, TValue)クラス
Dictionaryと同様に、この構造体も2つの型パラメータを持っています。上記のプログラムでは、Dictionary<string, string>クラスとしてインスタンス化していますので、その要素の型は必然的にKeyValuePair<string, string>となります(C#の場合)*。
* Dictionary<TKey, TValue>クラスの定義内のどこかで、new KeyValuePair<TKey, TValue>(…, …)によりインスタンス化したオブジェクトを返しているということです。
ジェネリック・クラスのコレクション
今回の最後に、System.Collections.Generics名前空間に用意されているジェネリックを使ったクラスや構造体、インターフェイスを列挙しておきます(VB版は省略)。
- abstract class Comparer<T>
- abstract class EqualityComparer<T>
- class Dictionary<TKey, TValue>
- class LinkedList<T>
- class List<T>
- class Queue<T>
- class SortedDictionary<TKey, TValue>
- class SortedList<TKey, TValue>
- class Stack<T>
- struct KeyValuePair<TKey, TValue>
- interface ICollection<T>
- interface IComparer<T>
- interface IDictionary<TKey, TValue>
- interface IEnumerable<T>
- interface IEnumerator<T>
- interface IEqualityComparer<T>
- interface IList<T>
この一覧からも分かるように、.NET Framework 1.xのクラス・ライブラリにあったほとんどのコレクション・クラスにはジェネリック版が用意されています。すでにVisual Studio 2005をお使いならば、安全で効率的なジェネリック版コレクションを積極的に使っていくべきでしょう。
今回はジェネリック・クラスを中心に解説してきました。次回では、ジェネリック・メソッドやジェネリック・デリゲート、そして、ジェネリック・デリゲートを用いて実装されたListジェネリック・クラスの便利なメソッドについてまとめてみます。
Copyright© Digital Advantage Corp. All Rights Reserved.