「C#.NET」SortedDictionaryで実現する完璧なデータ整理術 - 大地の女神が伝える秩序あるコレクション管理の神髄

2024年11月24日日曜日

コレクション

t f B! P L

名前空間 System.Collections.Generic

SortedDictionary

自己紹介

ようこそ、開発者の旅人よ。私は大地の女神「SortedDictionary」
私はいつも整然とした秩序を保つ存在。データをキーに基づいて昇順に並べ、見通しの良いコードの大地を作り上げるわ。

基本機能

「SortedDictionary」は、キーと値のペアを扱うデータ構造なの。
他のコレクションと違って、キーを常に昇順にソートして管理するのが私の特技よ。これにより、どんな場面でもすぐにデータを取り出せる利便性を提供するの。

内部では二分探索木を使っているから、データの検索や挿入、削除の効率もいいわよ。

「Dictionary」との違い

Dictionary」と私「SortedDictionary」の違いを語るわね。
「Dictionary」はハッシュテーブルを使っていて、順序の保証がないわ。データが必要な順序で並ぶ保証がないときに使うのが良い選択ね。
一方で、私は順序を大切にする存在。キーの昇順で常に整列するから、順序が必要な場面では私を選んでほしいわ。

役割と特徴

私の役割は秩序と整理。大量のデータがあっても、キーを自然な順序で並べ替えて保持するわ。ソートされていることで、範囲ベースの処理や先頭から順に処理する場合に特に便利よ。

注意点

気をつけてほしいのは、キーが重複できないこと。
また、大量のデータがある場合、私の内部構造の特性上、パフォーマンスが「Dictionary」より劣る場面もあるわ。用途に応じて使い分けるのが賢い選択よ。

カスタマイズと拡張性

キーのソート順はデフォルトで昇順だけど、自分でカスタムコンパレータを提供すれば、独自の順序で並べ替えることもできるの。例えば、降順に並べたい場合も、問題なく対応するわ。

サンプルコード

C#
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // SortedDictionaryのインスタンスを作成
        SortedDictionary<Guid, string> sortedDictionary = new SortedDictionary<Guid, string>();

        // データを追加 (キーはGUIDで生成)
        sortedDictionary.Add(Guid.NewGuid(), "データ1");
        sortedDictionary.Add(Guid.NewGuid(), "データ2");
        sortedDictionary.Add(Guid.NewGuid(), "データ3");

        // データを表示 (キーがソートされた順序で出力される)
        Console.WriteLine("データ一覧 (キー順):");
        foreach (var kvp in sortedDictionary)
        {
            Console.WriteLine($"キー: {kvp.Key}, 値: {kvp.Value}");
        }

        // 特定のキーを検索
        var searchKey = new Guid("01234567-89AB-CDEF-0123-456789ABCDEF");
        if (sortedDictionary.ContainsKey(searchKey))
        {
            Console.WriteLine($"キー {searchKey} が見つかりました: {sortedDictionary[searchKey]}");
        }
        else
        {
            Console.WriteLine($"キー {searchKey} は存在しません。");
        }

        // データを削除
        var removeKey = new Guid("12345678-90AB-CDEF-1234-567890ABCDEF");
        if (sortedDictionary.Remove(removeKey))
        {
            Console.WriteLine($"キー {removeKey} を削除しました。");
        }
        else
        {
            Console.WriteLine($"キー {removeKey} は削除できませんでした (存在しない可能性)。");
        }

        // 範囲を抽出して表示
        Console.WriteLine("範囲処理:");
        foreach (var kvp in sortedDictionary)
        {
            if (kvp.Key.CompareTo(Guid.NewGuid()) > 0)
            {
                Console.WriteLine($"キー: {kvp.Key}, 値: {kvp.Value}");
            }
        }
    }
}

解説

このサンプルコードでは、「SortedDictionary」を使ってGUIDをキー(キーの重複をさけたいだけ)にしてデータを管理しています。
また、キーが常に昇順で管理されているので、順序に基づく操作や検索が簡単です。用途に応じて「SortedDictionary」を選択し、秩序のあるデータ管理を実現してください。

降順で管理するSortedDictionaryのサンプルコード

C#
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // カスタムコンパレータを使って降順でソート
        SortedDictionary<Guid, string> sortedDictionary = new SortedDictionary<Guid, string>(
            Comparer<Guid>.Create((x, y) => y.CompareTo(x))
        );

        // データを追加 (キーはGUIDで生成)
        sortedDictionary.Add(Guid.NewGuid(), "データ1");
        sortedDictionary.Add(Guid.NewGuid(), "データ2");
        sortedDictionary.Add(Guid.NewGuid(), "データ3");

        // データを表示 (キーが降順にソートされて出力される)
        Console.WriteLine("降順にソートされたデータ一覧:");
        foreach (var kvp in sortedDictionary)
        {
            Console.WriteLine($"キー: {kvp.Key}, 値: {kvp.Value}");
        }

        // 最小値と最大値を取得
        Console.WriteLine("最大のキー:");
        Console.WriteLine(sortedDictionary.Keys.Max());

        Console.WriteLine("最小のキー:");
        Console.WriteLine(sortedDictionary.Keys.Min());

        // 特定のキーを検索
        var searchKey = Guid.NewGuid(); // 新たに作成したGUIDを検索
        if (sortedDictionary.ContainsKey(searchKey))
        {
            Console.WriteLine($"キー {searchKey} が見つかりました: {sortedDictionary[searchKey]}");
        }
        else
        {
            Console.WriteLine($"キー {searchKey} は存在しません。");
        }
    }
}

解説

このコードでは、カスタムコンパレータを使用して「SortedDictionary」がデフォルトの昇順ではなく降順でソートされるようにしています。 降順でソートするためには、Comparer<Guid>.Createを使い、比較ロジックを逆転させるだけで簡単に実現できます。

このブログを検索

QooQ