配列&コレクション

[C#] KeyValuePairの使い方 – Dictionaryとの違いも解説

KeyValuePairは、C#でキーと値のペアを表す構造体です。

主にコレクション内の要素をキーと値の組み合わせで扱う際に使用されます。

KeyValuePairは、キーと値の両方が読み取り専用で、変更はできません。

Dictionaryは、キーと値のペアを格納するコレクションで、KeyValuePairを内部的に使用していますが、Dictionaryは要素の追加や削除が可能です。

KeyValuePairは、Dictionaryの要素を列挙する際に使われることが多いです。

KeyValuePairとは何か

C#におけるKeyValuePairは、キーと値のペアを表現するための構造体です。

このデータ構造は、特にDictionaryと組み合わせて使用されることが多く、データの関連性を明確にするために役立ちます。

KeyValuePairは、2つのプロパティ、すなわちKey(キー)とValue(値)を持ち、これにより特定のキーに関連付けられた値を簡単に管理できます。

例えば、KeyValuePair<int, string>のように、整数をキーとして文字列を値に持つペアを作成することができます。

このように、KeyValuePairを使用することで、データの格納や取得が効率的に行えるため、特にコレクションを扱う際に非常に便利です。

KeyValuePairは、データの整合性を保ちながら、柔軟なデータ操作を可能にします。

KeyValuePairの使い方

KeyValuePairの宣言方法

KeyValuePairを宣言するには、まずその型を指定し、次にキーと値を初期化します。

以下は、整数をキー、文字列を値とするKeyValuePairの宣言例です。

KeyValuePair<int, string> kvp = new KeyValuePair<int, string>(1, "りんご");

このコードでは、キーが1、値が"りんご"KeyValuePairを作成しています。

KeyとValueの取得方法

KeyValuePairからキーと値を取得するには、それぞれのプロパティであるKeyValueを使用します。

以下の例では、先ほど宣言したkvpからキーと値を取得しています。

int key = kvp.Key; // キーを取得
string value = kvp.Value; // 値を取得

このコードを実行すると、keyには1が、valueには"りんご"が格納されます。

KeyValuePairを使ったループ処理

KeyValuePairは、コレクションをループ処理する際に非常に便利です。

以下の例では、Dictionaryを使用してKeyValuePairをループ処理しています。

Dictionary<int, string> fruits = new Dictionary<int, string>
{
    { 1, "りんご" },
    { 2, "ばなな" },
    { 3, "みかん" }
};
foreach (KeyValuePair<int, string> kvp in fruits)
{
    Console.WriteLine($"キー: {kvp.Key}, 値: {kvp.Value}");
}

このコードを実行すると、各果物のキーと値が表示されます。

キー: 1, 値: りんご
キー: 2, 値: ばなな
キー: 3, 値: みかん

KeyValuePairの比較方法

KeyValuePair同士を比較するには、Equalsメソッドを使用します。

以下の例では、2つのKeyValuePairが同じかどうかを比較しています。

KeyValuePair<int, string> kvp1 = new KeyValuePair<int, string>(1, "りんご");
KeyValuePair<int, string> kvp2 = new KeyValuePair<int, string>(1, "りんご");
bool areEqual = kvp1.Equals(kvp2); // 同じかどうかを比較

このコードを実行すると、areEqualにはtrueが格納されます。

KeyValuePairの応用例

KeyValuePairは、さまざまな場面で応用できます。

以下はその一部です。

  • データの集約: 複数のデータをKeyValuePairでまとめて管理することができます。
  • 設定の管理: 設定項目をキーと値のペアで管理することで、柔軟な設定管理が可能です。
  • データベースの操作: データベースから取得したデータをKeyValuePairで表現し、簡単に操作できます。

Dictionaryとの違い

Dictionaryの基本

Dictionaryは、キーと値のペアを格納するためのコレクションで、C#のSystem.Collections.Generic名前空間に含まれています。

Dictionaryは、キーを使用して値に迅速にアクセスできるため、データの検索や管理に非常に便利です。

以下は、Dictionaryの基本的な宣言と初期化の例です。

Dictionary<int, string> fruits = new Dictionary<int, string>
{
    { 1, "りんご" },
    { 2, "ばなな" },
    { 3, "みかん" }
};

このコードでは、整数をキー、文字列を値とするDictionaryを作成しています。

DictionaryとKeyValuePairの関係

Dictionaryは、内部的にKeyValuePairを使用してデータを管理しています。

各エントリは、キーと値のペアとして格納され、Dictionaryの操作を通じてKeyValuePairとしてアクセスされます。

つまり、DictionaryKeyValuePairの集合であると言えます。

Dictionaryの操作方法(追加・削除・更新)

Dictionaryでは、データの追加、削除、更新が簡単に行えます。

以下は、それぞれの操作の例です。

  • 追加:
fruits.Add(4, "ぶどう"); // 新しい果物を追加
  • 削除:
fruits.Remove(2); // キーが2の果物を削除
  • 更新:
fruits[1] = "青りんご"; // キーが1の果物を更新

これらの操作により、Dictionaryの内容を柔軟に変更できます。

DictionaryとKeyValuePairの使い分け

DictionaryKeyValuePairは、異なる目的で使用されます。

Dictionaryはデータのコレクションを管理するための構造であり、KeyValuePairはそのコレクション内の個々のエントリを表現します。

一般的に、データの格納や検索にはDictionaryを使用し、特定のエントリを操作する際にはKeyValuePairを使用します。

DictionaryのパフォーマンスとKeyValuePairの役割

Dictionaryは、ハッシュテーブルを基にしているため、キーによるデータの検索が非常に高速です。

平均的な検索時間はO(1)であり、大量のデータを扱う際にも効率的です。

一方、KeyValuePairは、Dictionary内のデータを表現するための軽量な構造体であり、データの整合性を保ちながら、柔軟な操作を可能にします。

KeyValuePairを使用することで、Dictionaryのデータを簡単に扱うことができ、プログラムの可読性も向上します。

KeyValuePairを使った実践例

KeyValuePairを使ったデータの格納と取得

KeyValuePairを使用してデータを格納し、取得する基本的な例を示します。

以下のコードでは、KeyValuePairを使って果物の名前とその価格を格納しています。

このコードを実行すると、fruitNameには"りんご"が、fruitPriceには150.0が格納されます。

DictionaryとKeyValuePairを組み合わせた処理

DictionaryKeyValuePairを組み合わせて、データを管理する例を示します。

以下のコードでは、果物の名前とその価格をDictionaryに格納し、KeyValuePairを使ってループ処理を行っています。

Dictionary<string, decimal> fruitPrices = new Dictionary<string, decimal>
{
    { "りんご", 150.0m },
    { "ばなな", 100.0m },
    { "みかん", 120.0m }
};
foreach (KeyValuePair<string, decimal> kvp in fruitPrices)
{
    Console.WriteLine($"果物: {kvp.Key}, 価格: {kvp.Value}円");
}

このコードを実行すると、各果物の名前と価格が表示されます。

果物: りんご, 価格: 150円
果物: ばなな, 価格: 100円
果物: みかん, 価格: 120円

KeyValuePairを使ったカスタムクラスの作成

KeyValuePairを利用してカスタムクラスを作成することも可能です。

以下の例では、果物の名前と価格を持つFruitクラスを定義し、KeyValuePairを使用しています。

public class Fruit
{
    public KeyValuePair<string, decimal> Info { get; set; }
    public Fruit(string name, decimal price)
    {
        Info = new KeyValuePair<string, decimal>(name, price);
    }
}
// 使用例
Fruit apple = new Fruit("りんご", 150.0m);
Console.WriteLine($"果物: {apple.Info.Key}, 価格: {apple.Info.Value}円");

このコードを実行すると、果物: りんご, 価格: 150円と表示されます。

KeyValuePairを使ったLINQクエリの活用

KeyValuePairはLINQクエリと組み合わせて使用することもできます。

以下の例では、Dictionaryから特定の条件に合う果物をフィルタリングしています。

Dictionary<string, decimal> fruitPrices = new Dictionary<string, decimal>
{
    { "りんご", 150.0m },
    { "ばなな", 100.0m },
    { "みかん", 120.0m },
    { "ぶどう", 200.0m }
};
var expensiveFruits = from kvp in fruitPrices
                      where kvp.Value > 120.0m
                      select kvp;
foreach (KeyValuePair<string, decimal> kvp in expensiveFruits)
{
    Console.WriteLine($"高価な果物: {kvp.Key}, 価格: {kvp.Value}円");
}

このコードを実行すると、価格が120円を超える果物が表示されます。

高価な果物: りんご, 価格: 150円
高価な果物: ぶどう, 価格: 200円

応用例

KeyValuePairを使ったソート処理

KeyValuePairを使用してデータをソートすることができます。

以下の例では、果物の名前とその価格を持つDictionaryを作成し、価格でソートしています。

Dictionary<string, decimal> fruitPrices = new Dictionary<string, decimal>
{
    { "りんご", 150.0m },
    { "ばなな", 100.0m },
    { "みかん", 120.0m },
    { "ぶどう", 200.0m }
};
// 価格でソート
var sortedFruits = fruitPrices.OrderBy(kvp => kvp.Value);
foreach (KeyValuePair<string, decimal> kvp in sortedFruits)
{
    Console.WriteLine($"果物: {kvp.Key}, 価格: {kvp.Value}円");
}

このコードを実行すると、価格が安い順に果物が表示されます。

果物: ばなな, 価格: 100円
果物: みかん, 価格: 120円
果物: りんご, 価格: 150円
果物: ぶどう, 価格: 200円

KeyValuePairを使ったデータのフィルタリング

KeyValuePairを使用して特定の条件に基づいてデータをフィルタリングすることも可能です。

以下の例では、価格が150円以上の果物を抽出しています。

Dictionary<string, decimal> fruitPrices = new Dictionary<string, decimal>
{
    { "りんご", 150.0m },
    { "ばなな", 100.0m },
    { "みかん", 120.0m },
    { "ぶどう", 200.0m }
};
// 価格が150円以上の果物をフィルタリング
var expensiveFruits = fruitPrices.Where(kvp => kvp.Value >= 150.0m);
foreach (KeyValuePair<string, decimal> kvp in expensiveFruits)
{
    Console.WriteLine($"高価な果物: {kvp.Key}, 価格: {kvp.Value}円");
}

このコードを実行すると、150円以上の果物が表示されます。

高価な果物: りんご, 価格: 150円
高価な果物: ぶどう, 価格: 200円

KeyValuePairを使った複雑なデータ構造の管理

KeyValuePairを使用して、より複雑なデータ構造を管理することもできます。

以下の例では、果物の名前とその価格に加えて、果物の色を持つカスタムクラスを作成し、KeyValuePairを使用しています。

public class FruitInfo
{
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Color { get; set; }
    public FruitInfo(string name, decimal price, string color)
    {
        Name = name;
        Price = price;
        Color = color;
    }
}
// 複雑なデータ構造の管理
List<KeyValuePair<string, FruitInfo>> fruits = new List<KeyValuePair<string, FruitInfo>>
{
    new KeyValuePair<string, FruitInfo>("りんご", new FruitInfo("りんご", 150.0m, "赤")),
    new KeyValuePair<string, FruitInfo>("ばなな", new FruitInfo("ばなな", 100.0m, "黄")),
    new KeyValuePair<string, FruitInfo>("みかん", new FruitInfo("みかん", 120.0m, "オレンジ")),
    new KeyValuePair<string, FruitInfo>("ぶどう", new FruitInfo("ぶどう", 200.0m, "紫"))
};
// データの表示
foreach (KeyValuePair<string, FruitInfo> kvp in fruits)
{
    Console.WriteLine($"果物: {kvp.Value.Name}, 価格: {kvp.Value.Price}円, 色: {kvp.Value.Color}");
}

このコードを実行すると、各果物の名前、価格、色が表示されます。

果物: りんご, 価格: 150円, 色: 赤
果物: ばなな, 価格: 100円, 色: 黄
果物: みかん, 価格: 120円, 色: オレンジ
果物: ぶどう, 価格: 200円, 色: 紫

このように、KeyValuePairを使用することで、複雑なデータ構造を簡単に管理し、柔軟なデータ操作が可能になります。

まとめ

この記事では、C#におけるKeyValuePairの基本的な使い方や、Dictionaryとの関係、さらには実践的な応用例について詳しく解説しました。

KeyValuePairは、データの管理や操作を効率的に行うための強力なツールであり、特にコレクションを扱う際に非常に役立ちます。

これを機に、KeyValuePairを活用して、より効果的なプログラミングを実践してみてください。

関連記事

Back to top button