書籍転載
文法からはじめるプログラミング言語Microsoft Visual Basic入門

VB開発者のためのコレクション・クラス入門
― 第12章 クラスライブラリの活用 ―

WINGSプロジェクト 高江 賢(監修 山田 祥寛)
2010/09/08
Page1 Page2 Page3

本コーナーは、日経BPソフトプレス発行の書籍『文法からはじめるプログラミング言語Microsoft Visual Basic入門』の中から、特にInsider.NET読者に有用だと考えられる章や個所をInsider.NET編集部が選び、同社の許可を得て転載したものです。基本的に元の文章をそのまま転載していますが、レイアウト上の理由などで文章の記述を変更している部分(例:「上の図」など)や、図の位置などを本サイトのデザインに合わせている部分が若干ありますので、ご了承ください。『文法からはじめるプログラミング言語Microsoft Visual Basic入門』の詳細は「目次情報ページ」もしくは日経BPソフトプレスのサイトをご覧ください。

ご注意:本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。

 この章では、.NET Frameworkクラスライブラリで提供されている、いくつかのクラスについて説明しましょう。.NET Frameworkには汎用的に使用できる非常に多くのクラスが揃っています。とても本書ではすべてを紹介できませんが、ここでは特に頻繁に使用される基礎的なクラスについて説明します。

12.1 コレクション

 コレクションとは、同じ型のデータをまとめて管理するためのデータ構造を総称したものです*1。前述の配列もコレクションの一種です。

*1) C++ 言語では、コンテナとも言います。

図12-1 コレクション

 コレクションには、いくつかの種類があり、それぞれデータ構造やアルゴリズムが異なっています。.NET Frameworkのクラスライブラリでは、その種類に対応したクラスが提供されてお、それらはコレクションクラスと呼ばれています。コレクションクラスごとに、できることとできないことがあるため、用途に適したデータ構造を選択する必要があります。

 ここではまず、基本となるデータ構造について説明します。

12.1.1 リスト、スタック、キュー

 最も基本となるコレクションは、10.1節で説明した配列です。配列は、同じデータ型のデータを順番に並べて管理するものでした。一般的に配列は、事前にデータを格納する場所を確保しておく必要があります。データは決められたところに、順番に格納されます。たとえると、教室に並べられた机に順番に人が座っていくようなものです。配列ではデータが格納されている位置が決まっているため、インデックスを指定するだけで即座にデータを参照することができます。

 データを並べて管理するものに、もう1つリストと呼ばれるデータ構造があります。一般的なリストは、配列と異なり、データの格納場所を確保しておく必要はありません。たとえるなら、机のない教室で人が順番に手をつないでいくようなものです。決まった席がないので、場所や長さを決めていなくても、どんどん人と人をつないでいくことができます。ただし、データの位置が決まっていないため、インデックスを指定しても、前から順にたどっていくしかありません。隣の人の場所を知っているのは、つながっている人だけなのです。

 このようなデータ構造となっているリストをリンクリストと呼びます。その中で、次の要素のアドレスだけを保持しているものを単方向リンクリスト、次の要素だけでなく1つ前の要素のアドレスも保持しているものを双方向リンクリストと呼びます。

図12-2 配列とリンクリストの違い

 今度は、データを管理する構造ではなく、機能的な面に目を向けてみましょう。コレクションには、特徴的な機能を持った2つのデータ構造があります。

 1つはスタックと呼ばれる構造です。スタックは後入れ先出し(Last In First Out:LIFO)とも呼ばれ、最後に格納したデータから順に取り出すことができます。

 具体的な例でたとえると、1つの出入り口しかない細長い車庫のようなものです。車を入庫する際には制限はありませんが、最後に入庫した車からしか出庫できません。

図12-3 スタック

 スタックは、コンピュータ内部でのメモリ管理や、コンパイラでの内部処理で活用されています。ただし、一般的なアプリケーションでの使用頻度は低いでしょう。

 2つ目はキューと呼ばれるデータ構造です。先入れ先出し(First In First Out:FIFO)、または待ち行列とも呼ばれます。こちらは銀行のATMや高速道路の料金所に1列で並ぶ顧客のように、追加した順番のまま、先頭からデータを取り出すことができます。

図12-4 キュー

 スタックと異なり、キューは応用範囲の広いデータ構造です。多くのデータを順番に処理する場合や、バッファ*2のような大きなデータを一時的に格納する用途に使用されます。

 以上がコレクションの基本的なデータ構造です。次からは、個々のコレクションクラスについて説明していきます。

*2) キーボードやプリンタなどの入出力装置とCPUなどの処理装置でデータをやり取りする際、処理速度や通信速度の差を補うためにデータを一時的に保存する記憶領域のことです。

12.1.2 Visual Basic 2003までのコレクションクラス

 Visual Basic 2003までのコレクションクラスは、System.Collections名前空間にまとめられています。それらのクラスには、少し使い勝手の悪い面がありました。たとえば、ArrayListというクラスを見てみましょう。ArrayListはその名前が示すように、リンクリストではなく配列をベースとしたリストです。つまり、動的にサイズを変更できる配列です。

Class MainClass
  Public Shared Sub Main()

    ' ArrayListをインスタンス化
    Dim a As New ArrayList()

    a.Add("Hello")
    a.Add("World")

    ' Option Strict Onでは、
    ' 暗黙的な変換はできないというエラーになる
    ' Dim b As String = a(0)

    ' インデックスによる参照
    Dim s As String = DirectCast(a(1), String) ' 出力値:World

    Console.WriteLine(s)

  End Sub
End Class
[サンプル]arrayList.vb

 ArrayListでは、Addメソッドでデータを追加します。追加した要素は、配列のようにインデックスによって参照することができます。

 ただし、データをそのまま参照すると、Option Strict Onの設定ではエラーとなり、必ずキャストが必要になります。これは、ArrayListの内部では、データをすべてObject型として保持しているからです。どんな型のデータを追加しても、参照するときにはObject型になってしまい、ダウンキャストが必要となります。

 System.Objectクラスは、すべてのクラスの基本クラスなので、ArrayListにはどのような型でも追加できます。そのためArrayListでは、要素の型を限定することができないのです。たとえ誤って意図しない型を追加したとしても、エラーにはなりません。反対に、意図しない参照であれば例外が発生してしまいます。

 このような問題を解決するために、Visual Basic 2005ではジェネリック(generics)というしくみ*3が追加され、ジェネリックを使用したコレクションクラスが提供されるようになりました。ArrayListのような従来のコレクションクラスも使用できますが、Visual Basic 2005以降では、ジェネリックコレクションクラスの使用が推奨されています。そのため本書では、ジェネリックコレクションクラスについてのみ取り上げます。

*3) ジェネリックは、C++ 言語のテンプレートと似たものです。


 INDEX
  [書籍転載]文法からはじめるプログラミング言語Microsoft Visual Basic入門
  VB開発者のためのコレクション・クラス入門
  1.リスト、スタック、キュー/VB 2003までのコレクションクラス
    2.ジェネリック/LinkedListクラス/StackとQueueクラス
    3.Dictionaryクラス/SortedListクラスとSortedDictionaryクラス

インデックス・ページヘ 「文法からはじめるプログラミング言語Microsoft Visual Basic入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間