連載
» 2005年05月27日 05時00分 公開

.NET TIPS:1つのキー文字列に対して複数の文字列値を保持するには?

[遠藤孝信,デジタルアドバンテージ]
.NET TIPS
Insider.NET


「.NET TIPS」のインデックス

連載目次

 「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オブジェクトへの値の追加(C#)
同じキー文字列に対して複数の文字列値を追加できる。VB.NETのコード例については下記のサンプル・プログラムを参照。

 そして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

NameValueCollectionクラスを使用したC#のサンプル・プログラム(namevalues.cs)
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クラスを使用したVB.NETのサンプル・プログラム(namevalues.vb)
namevalues.vbのダウンロード

 なおNameValueCollectionクラスには、コレクション内の値の設定/取得するためのSetメソッド/Getメソッドが用意されているが、これらはインデクサ(VB.NETの場合は既定のプロパティとなっているItemプロパティ)で代用できるため、わざわざメソッドを使う必要はない。

カテゴリ:クラス・ライブラリ 処理対象:コレクション
使用ライブラリ:Hashtableクラス(System.Collections名前空間)
使用ライブラリ:NameValueCollectionクラス(System.Collections.Specialized名前空間)
関連TIPS:ハッシュテーブル(連想配列)を使うには?


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。