「TIPS:ハッシュテーブル(連想配列)を使うには?」で解説しているように、ハッシュテーブル(Hashtableクラス)では、キーと値のペアをコレクションとして保持することができる。
ハッシュテーブルの用途としては、そのキーも値も文字列であるというケースが多いが、1つのキー文字列に対して複数の文字列を保持したい場合には、複数の文字列を1つの文字列として連結するか(区切り文字が必要)、配列やArrayListオブジェクトなどに複数の文字列を格納し、それをキーに対する値とするなどしなければならない。
.NET Frameworkのクラス・ライブラリには、このような1つのキー文字列に対して複数の文字列値を保持する特殊なコレクションがNameValueCollectionクラス(System.Collections.Specialized名前空間)として用意されている。
NameValueCollectionクラスでは、Hashtableクラスと同様に、キーと値のペアをコレクションに追加するためにAddメソッドが使用できるが、すでにキーがコレクションに存在する場合には、それに対する値に文字列が追加されることになる(Hashtalbeクラスでは例外が発生する)。
NameValueCollection nvc = new NameValueCollection();
nvc.Add("キー1", "値1-1");
nvc.Add("キー1", "値1-2");
// nvcは「キー1」に対して2つの文字列を保持している
そしてNameValueCollectionクラスでは、コンマ(,)で連結された1つの文字列か、文字列の配列として、コレクションからその値を取り出すことができる。
NameValueCollectionクラスの主要なプロパティやメソッドを使用したサンプル・プログラムを以下に示す。
// namevalues.cs
using System;
using System.Collections.Specialized;
public class NameAndValues {
  static void Main() {
    NameValueCollection nvc = new NameValueCollection();
    // キーと値の追加
    nvc.Add("キー1", "値1-1");
    nvc.Add("キー1", "値1-2");
    nvc.Add("キー2", "値2-1");
    //////////////////////////////////////////////////
    // キー文字列の取得
    // すべてのキー文字列の取得
    string[] keys = nvc.AllKeys;
    foreach (string s in keys) {
      Console.WriteLine(s);
    }
    // 出力:
    // キー1
    // キー2
    // インデックス番号によるキー文字列の取得
    Console.WriteLine(nvc.GetKey(0)); // 出力:キー1
    Console.WriteLine(nvc.GetKey(1)); // 出力:キー2
    //////////////////////////////////////////////////
    // あるキーに対する値を文字列配列として取得
    // インデックス番号により指定したキーのすべての値を
    // 文字列配列として取得
    string[] values1 = nvc.GetValues(0);
    foreach (string s in values1) {
      Console.WriteLine(s);
    }
    // 出力:
    // 値1-1
    // 値1-2
    // キー文字列により指定したキーのすべての値を
    // 文字列配列として取得
    string[] values2 = nvc.GetValues("キー1");
    foreach (string s in values2) {
      Console.WriteLine(s);
    }
    // 出力:
    // 値1-1
    // 値1-2
    //////////////////////////////////////////////////
    // あるキーに対する値をコンマ区切り文字列として取得
    // インデックス番号により指定したキーのすべての値を
    // コンマ区切りの文字列として取得
    Console.WriteLine(nvc[0]); // 出力:値1-1,値1-2
    Console.WriteLine(nvc[1]); // 出力:値2-1
    // キー文字列により指定したキーのすべての値を
    // コンマ区切りの文字列として取得
    Console.WriteLine(nvc["キー1"]); // 出力:値1-1,値1-2
    Console.WriteLine(nvc["キー2"]); // 出力:値2-1
  }
}
// コンパイル方法:csc namevalues.cs
' namevalues.vb
Imports System
Imports System.Collections.Specialized
Public Class NameAndValues
  Shared Sub Main
    Dim nvc As NameValueCollection = new NameValueCollection()
    ' キーと値の追加
    nvc.Add("キー1", "値1-1")
    nvc.Add("キー1", "値1-2")
    nvc.Add("キー2", "値2-1")
    ''''''''''''''''''''''''''''''''''''''''''''''''''
    ' キー文字列の取得
    ' すべてのキー文字列の取得
    Dim keys As String() = nvc.AllKeys
    For Each s As String In keys
      Console.WriteLine(s)
    Next
    ' 出力:
    ' キー1
    ' キー2
    ' インデックス番号によるキー文字列の取得
    Console.WriteLine(nvc.GetKey(0)) ' 出力:キー1
    Console.WriteLine(nvc.GetKey(1)) ' 出力:キー2
    ''''''''''''''''''''''''''''''''''''''''''''''''''
    ' あるキーの値を文字列配列として取得
    ' インデックス番号により指定したキーのすべての値を
    ' 文字列配列として取得
    Dim values1 As String() = nvc.GetValues(0)
    For Each s As String In values1
      Console.WriteLine(s)
    Next
    ' 出力:
    ' 値1-1
    ' 値1-2
    ' キー文字列により指定したキーのすべての値を
    ' 文字列配列として取得
    Dim values2 As String() = nvc.GetValues("キー1")
    For Each s As String In values2
      Console.WriteLine(s)
    Next
    ' 出力:
    ' 値1-1
    ' 値1-2
    ''''''''''''''''''''''''''''''''''''''''''''''''''
    ' あるキーの値をコンマ区切り文字列として取得
    ' インデックス番号により指定したキーのすべての値を
    ' コンマ区切りの文字列として取得
    Console.WriteLine(nvc(0)) ' 出力:値1-1,値1-2
    Console.WriteLine(nvc(1)) ' 出力:値2-1
    ' キー文字列により指定したキーのすべての値を
    ' コンマ区切りの文字列として取得
    Console.WriteLine(nvc("キー1")) ' 出力:値1-1,値1-2
    Console.WriteLine(nvc("キー2")) ' 出力:値2-1
  End Sub
End Class
' コンパイル方法:vbc /r:System.dll  namevalues.vb
なおNameValueCollectionクラスには、コレクション内の値の設定/取得するためのSetメソッド/Getメソッドが用意されているが、これらはインデクサ(VB.NETの場合は既定のプロパティとなっているItemプロパティ)で代用できるため、わざわざメソッドを使う必要はない。
カテゴリ:クラス・ライブラリ 処理対象:コレクション
使用ライブラリ:Hashtableクラス(System.Collections名前空間)
使用ライブラリ:NameValueCollectionクラス(System.Collections.Specialized名前空間) 
関連TIPS:ハッシュテーブル(連想配列)を使うには?
Copyright© Digital Advantage Corp. All Rights Reserved.