.NET C#,VB.NET,VC.NET

■Hashtable 連想配列

連想配列のサンプルです。
C++のSTLでいうところのmapのようなものです。
キーと、それと対になる値とをペアで記憶します。

サンプルソースはコンソールアプリです。
System.Collections.Hashtable
を利用します。

C#
using System;
using System.Collections;

namespace Hashtable_test
{
    /// <summary>
    /// Class1 の概要の説明です。
    /// </summary>
    class Class1
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            // hashtableを作ります
            Hashtable hash = new Hashtable();

            // キーと値をペアで幾つか格納します
            hash.Add( "A", 10 );    // Addメソッドで追加
            hash["B"] = 20;         // インデクサで追加
            hash["C"] = 30;         // インデクサで追加

            // キーの重複は許されないので下記は失敗します。
            try
            {
                hash.Add( "A", 0 );
            }
            catch( ArgumentException )
            {
                Console.WriteLine( "キーの重複は許されません\r\n" );
            }

            // インデクサを使って値を書き換え可能です。
            hash["A"] = 0;

            // キーを指定してペアを削除
            hash.Remove( "B" );

            // キーが見つからなければnullを返す
            Console.WriteLine( "B={0}\r\n", hash["B"] );

            // 特定のキーの存在を確認
            if ( hash.ContainsKey("A") )
                Console.WriteLine( "key A は存在します。\r\n" );

            // 特定の値の存在を確認
            if ( hash.ContainsValue(0) )
                Console.WriteLine( "value 0 は存在します。\r\n" );

            // キーと値のペアをすべて出力
            foreach( object key in hash.Keys )
            {
                Console.WriteLine( "key={0} key-type={1} / value={2} value-type={3}",
                    key,
                    key.GetType(), 
                    hash[key], 
                    hash[key].GetType() );
            }
        }
    }
}
VB.NET
Module Module1

    Sub Main()
        'hashtableを作ります
        Dim hash As System.Collections.Hashtable = New System.Collections.Hashtable

        'キーと値をペアで幾つか格納します
        hash.Add("A", 10)   'Addメソッドで追加
        hash("B") = 20      '配列に代入する要領で追加 
        hash("C") = 30      '配列に代入する要領で追加 

        'キーの重複は許されないので下記は失敗します。
        Try
            hash.Add("A", 0)
        Catch
            Console.WriteLine("キーの重複は許されません" + ControlChars.CrLf)
        End Try

        '配列に代入する要領で値を書き換え可能
        hash("A") = 0

        'キーを指定してペアを削除
        hash.Remove("B")

        'キーが見つからなければnullを返す
        Console.WriteLine("B={0}" + ControlChars.CrLf, hash("B"))

        '特定のキーの存在を確認
        If hash.ContainsKey("A") Then
            Console.WriteLine("key A は存在します。" + ControlChars.CrLf)
        End If

        '特定の値の存在を確認
        If hash.ContainsValue(0) Then
            Console.WriteLine("value 0 は存在します。" + ControlChars.CrLf)
        End If

        'キーと値のペアをすべて出力
        For Each key As Object In hash.Keys
            Console.WriteLine("key={0} key-type={1} / value={2} value-type={3}", _
                key, _
                key.GetType(), _
                hash(key), _
                hash(key).GetType())
        Next
    End Sub

End Module
VC.NET
#include "stdafx.h"

#using <mscorlib.dll>

using namespace System;
using namespace System::Collections;

int _tmain()
{
    // hashtableを作ります
    Hashtable *hash = new Hashtable();
    
    // キーと値をペアで幾つか格納します
    hash->Add( S"A", __box(10) );   // 値はボックス化しないとコンパイルエラー
    hash->Add( S"B", __box(20) );
    hash->Add( S"C", __box(30) );

    // キーの重複は許されないので下記は失敗します。
    try
    {
        hash->Add( S"A", __box(10) );
    }
    catch( ArgumentException* )
    {
        Console::WriteLine( S"キーの重複は許されません\r\n" );
    }

    // 値を書き換え可能です。
    hash->set_Item(S"A", __box(0));

    // キーを指定してペアを削除
    hash->Remove( S"B" );

    // キーが見つからなければnullを返す
    Console::WriteLine( S"B={0}\r\n", hash->get_Item(S"B") );

    // 特定のキーの存在を確認
    if ( hash->ContainsKey(S"A") )
        Console::WriteLine( S"key A は存在します。\r\n" );

    // 特定の値の存在を確認
    if ( hash->ContainsValue(__box(0)) )
        Console::WriteLine( S"value 0 は存在します。\r\n" );

    // キーと値のペアをすべて出力
    IDictionaryEnumerator __gc *emu = hash->GetEnumerator();
    while (emu->MoveNext())
    {
        Console::WriteLine(S"key={0} key-type={1} / value={2} value-type={3}",
            emu->Key,
            emu->Key->GetType(),
            emu->Value,
            emu->Value->GetType() );
    }

    return 0;
}
【実行結果】
    キーの重複は許されません

    B=

    key A は存在します。

    value 0 は存在します。

    key=C key-type=System.String / value=30 value-type=System.Int32
    key=A key-type=System.String / value=0 value-type=System.Int32

トップ  > .NET C#,VB.NET,VC.NET
Copyright (C) 2005.09 〜 By Shougo Suzaki

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送