「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.