C# のデータ構造:Array クラスと HashTable の利用法

System.Array クラスの理解

C# において、配列を操作するための基底クラスとして System.Array が存在します。このクラスは静的メソッドを含み、配列の特性や操作方法を定義しています。

主要なプロパティ

プロパティ名説明
Length全次元にわたる要素の合計数を 32 ビット整数で取得します。
LongLength全次元にわたる要素の合計数を 64 ビット整数で取得します。
Rank配列の階数(多次元かどうかを含む次元数)を取得します。
IsFixedSize配列のサイズが固定されているかどうかを示すブール値を返します。
IsReadOnly配列が読み取り専用モードかどうかを示します。

代表的なメソッド

以下は、Array クラスで提供される便利な静的メソッドの一部です。

  • Sort(Array): 要素を昇順に並べ替えます。IComparable インターフェースの実装が必要です。
  • Reverse(Array): 配列内の要素の順序を逆転させます。
  • Copy: ある範囲の要素を別の配列へコピーします。
  • IndexOf(Array, Object): 特定のオブジェクトが初めて現れるインデックスを探索します。
  • Clear: 指定した範囲の要素を初期値(null や 0 など)に設定します。

コード例:配列の操作

以下のサンプルでは、数値データに対してソートと反転処理を行い、結果を出力しています。

using System;

namespace CollectionDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // データの初期化
            int[] sensorValues = { 55, 88, 12, 99, 44, 21 };
            
            Console.WriteLine("--- 元のデータ ---");
            DisplayArray(sensorValues);

            // ソートの実行
            Array.Sort(sensorValues);
            Console.WriteLine("\n--- ソート後 ---");
            DisplayArray(sensorValues);

            // 反転処理
            Array.Reverse(sensorValues);
            Console.WriteLine("\n--- 反転後 ---");
            DisplayArray(sensorValues);

            Console.ReadKey();
        }

        private static void DisplayArray(int[] arr)
        {
            foreach (var val in arr)
            {
                Console.Write(val + " ");
            }
        }
    }
}

配列のコピー処理に関する注意点

配列データを複製する際、Clone() メソッドと Array.Copy() メソッドには明確な違いがあります。

  • Clone(): 非静的メソッドであり、新しい配列インスタンスを生成して Object 型で返します。使用時にはキャストが必要です。
  • Copy(): 静的メソッドであり、既存の配列へ要素を埋め込む形となります。対象の配列サイズは事前に確保しておく必要があります。
// クローンの例 (独立した参照の作成)
int[] original = { 10, 20, 30 };
int[] cloned = (int[])original.Clone();

// コピーの例 (既存配列への展開)
int[] destination = new int[5];
Array.Copy(original, destination, original.Length);

System.Collections.HashTable

HashTable は、キーとバリューの組を管理するコレクションクラスです(System.Collections ネームスペース)。

  • 各エントリは object 型として扱われるため、あらゆる型のデータを格納可能です。
  • キー(Key)は一意である必要があり、大文字小文字を区別します。
  • 高速な検索のために設計されています。

基本操作

using System;
using System.Collections;

class HashTableSample
{
    public static void Run()
    {
        Hashtable userMap = new Hashtable();

        // 要素の追加
        userMap["ID_101"] = "Tanaka";
        userMap["ID_102"] = "Sato";
        userMap["ID_103"] = "Suzuki";

        // 特定キーの存在確認と追加ロジック
        if (!userMap.ContainsKey("ID_104"))
        {
            userMap.Add("ID_104", "Watanabe");
        }
        
        // 値による検索
        if (userMap.ContainsValue("Watanabe"))
        {
            Console.WriteLine("ユーザーが見つかりました。");
        }
    }
}

ハッシュテーブルの走査とソート

HashTable の中身を反復処理するには、DictionaryEntry オブジェクトを使用します。また、内部ではハッシュアルゴリズムを用いるため、キーの順序は保証されません。ソートが必要な場合は、鍵リストを一時保存し、並べ替えてからアクセスする必要があります。

// DictionaryEntry を用いたループ
foreach (DictionaryEntry entry in userMap)
{
    Console.WriteLine($"{entry.Key} : {entry.Value}");
}

// キーのソート(ワークアラウンド)
ArrayList sortedKeys = new ArrayList(userMap.Keys);
sortedKeys.Sort();

Console.WriteLine("--- ソートされたキー順 ---");
foreach (string key in sortedKeys)
{
    Console.WriteLine(key + " => " + userMap[key]);
}

6月18日 22:32 投稿