連載:[完全版]究極のC#プログラミング

Chapter2 ジェネリック

川俣 晶
2009/08/17

2.5 ジェネリックコレクションの使い方

 ジェネリックコレクション(ジェネリックの機能を使用しているコレクションクラス)の使い方は、難しいものではない。

 基本的な使い方だけに限れば、たった1つ、次の原則だけを覚えればよい。

  • ジェネリックコレクションの型名の後に、扱うデータの型名を「<」と「>」で囲んで記述する(複数のデータ型を扱う場合にはカンマで区切る)

 このようにして記述した文字列を、独立した型名と同じように書けばよい。つまり、文字列をListクラスに格納する場合は、

List<string>

という文字列を型名のように使えばよい。「new ArrayList()」が有効であるのと同じように、「new List<string>()」は有効である。

 Dictionaryクラスのように、キー(key)と値(value)の2つの型を用いるクラスの場合は、<>内で型を2つ指定する。キーが整数で値が文字列なら、

Dictionary<int, string>

と記述する。あとは、従来のコレクションとほとんど扱いに差はない。次のリスト2.4はこれらのクラスの使用例である。

using System;
using System.Collections.Generic;

class Program
{
  static void Main(string[] args)
  {
    // 文字列を要素として扱うListクラス
    List<string> list = new List<string>();
    list.Add("Sample List");

    Console.WriteLine(list[0]); // 出力:Sample List

    // キーが整数で値が文字列の要素を扱うDictionaryクラス
    Dictionary<int, string> dic = new Dictionary<int, string>();
    dic[0] = "Sample Dictionary";

    Console.WriteLine(dic[0]); // 出力:Sample Dictionary
  }
}
リスト2.4 ListクラスとDictionaryクラスの使用例

 もちろん、「<」と「>」で囲んで指定した型は、その型だけでなくその型を継承した型も受け入れる。インターフェースを指定した場合は、そのインターフェースを実装した型のインスタンスを受け入れる。

 基底クラスの型のコレクションにそれを継承した型のインスタンスを格納した例と、インターフェースのコレクションにそれを実装したクラスのインスタンスを格納した例を、次ページのリスト2.5に示す。このあたりは、C#のほかの機能と同様であり、難しいことはないだろう。

using System;
using System.Collections.Generic;

// インターフェースの定義
public interface ISample
{
  void SayISample();
}

// 抽象クラスの定義
public abstract class SampleBase
{
  public abstract void SaySample();
}

// SampleBaseクラスを継承し、ISampleインターフェースを実装したクラス
public class Sample : SampleBase, ISample
{
  public override void SaySample()
  {
    Console.WriteLine("Sample!");
  }
  public void SayISample()
  {
    Console.WriteLine("ISample!");
  }
}

class Program
{
  static void Main(string[] args)
  {
    // SampleBase型のコレクションにSampleオブジェクトを追加
    List<SampleBase> list1 = new List<SampleBase>();
    list1.Add(new Sample());

    list1[0].SaySample(); // 出力:Sample!

    // ISample型のコレクションにSampleオブジェクトを追加
    List<ISample> list2 = new List<ISample>();
    list2.Add(new Sample());

    list2[0].SayISample(); // 出力:ISample!
  }
}
リスト2.5 継承とインターフェースを使った例


 INDEX
  [完全版]究極のC#プログラミング
  Chapter2 ジェネリック
    1.2.1 ジェネリックとは何か?
    2.2.2 新しいコレクションの紹介
    3.2.3 新しいコレクションクラス―LinkedListクラス
    4.2.4 新しいコレクションクラス―SortedDictionaryクラス
  5.2.5 ジェネリックコレクションの使い方
    6.2.6 ジェネリックメソッドと型推論
    7.2.7 HashtableクラスとDictionaryクラスの非互換性
    8.2.8 ジェネリックなクラスを自作する
    9.2.9 制約の付いたジェネリックなクラス/C++のtemplate機能との相違/練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


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 記事ランキング

本日 月間