[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を活用して、より効果的なプログラミングを実践してみてください。