[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
からキーと値を取得するには、それぞれのプロパティであるKey
とValue
を使用します。
以下の例では、先ほど宣言した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
としてアクセスされます。
つまり、Dictionary
はKeyValuePair
の集合であると言えます。
Dictionaryの操作方法(追加・削除・更新)
Dictionary
では、データの追加、削除、更新が簡単に行えます。
以下は、それぞれの操作の例です。
- 追加:
fruits.Add(4, "ぶどう"); // 新しい果物を追加
- 削除:
fruits.Remove(2); // キーが2の果物を削除
- 更新:
fruits[1] = "青りんご"; // キーが1の果物を更新
これらの操作により、Dictionary
の内容を柔軟に変更できます。
DictionaryとKeyValuePairの使い分け
Dictionary
とKeyValuePair
は、異なる目的で使用されます。
Dictionary
はデータのコレクションを管理するための構造であり、KeyValuePair
はそのコレクション内の個々のエントリを表現します。
一般的に、データの格納や検索にはDictionary
を使用し、特定のエントリを操作する際にはKeyValuePair
を使用します。
DictionaryのパフォーマンスとKeyValuePairの役割
Dictionary
は、ハッシュテーブルを基にしているため、キーによるデータの検索が非常に高速です。
平均的な検索時間はO(1)であり、大量のデータを扱う際にも効率的です。
一方、KeyValuePair
は、Dictionary
内のデータを表現するための軽量な構造体であり、データの整合性を保ちながら、柔軟な操作を可能にします。
KeyValuePair
を使用することで、Dictionary
のデータを簡単に扱うことができ、プログラムの可読性も向上します。
KeyValuePairを使った実践例
KeyValuePairを使ったデータの格納と取得
KeyValuePair
を使用してデータを格納し、取得する基本的な例を示します。
以下のコードでは、KeyValuePair
を使って果物の名前とその価格を格納しています。
このコードを実行すると、fruitName
には"りんご"
が、fruitPrice
には150.0
が格納されます。
DictionaryとKeyValuePairを組み合わせた処理
Dictionary
とKeyValuePair
を組み合わせて、データを管理する例を示します。
以下のコードでは、果物の名前とその価格を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
を活用して、より効果的なプログラミングを実践してみてください。