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]);
}