C# PR

C# Dictionaryのforeach完全ガイド!キー・値の取得から注意点まで

記事内に商品プロモーションを含む場合があります

こんにちは!

C#でプログラミングをしていると、キーと値のペアを管理する「Dictionary」を使う機会が頻繁にあります。このDictionaryの中身を順番に処理したいとき、どのように書けば良いのでしょうか。

Dictionaryをforeachでループするにはどう書くの?
キーだけ、値だけを取り出す方法も知りたいな。
パフォーマンスを考えると、どの書き方が良いんだろう?

C#でDictionaryをforeachで処理する方法について、このような疑問をお持ちではないでしょうか。

この記事では、C#のDictionaryをforeachで繰り返し処理する方法について、基本的な使い方から、キーや値だけを取り出す方法、そして注意点までを詳しく解説します。

この記事は次のような方におすすめです。

この記事はこんな人におすすめ!
  • C#のDictionaryをforeachでループする方法を知りたい方
  • Dictionaryのキーと値を効率的に取り出したい方
  • Dictionaryの繰り返し処理における注意点を理解したい方
  • C#でのデータ操作をスムーズに行いたい開発者の方
  • C#の基礎をしっかりと固めたいプログラミング初学者の方

この記事を読めば、Dictionaryをforeachでループするさまざまな方法が理解でき、実際のコードですぐに使える知識が身につきます。Dictionaryを使いこなして、より効率的なC#プログラミングを実現しましょう。

「Dictionaryの繰り返し処理で困っている方」「C#のコレクション操作をマスターしたい方」は、ぜひ参考にしてください。

それでは、順を追って詳しく見ていきましょう!

Dictionaryとは何か

まずは、Dictionaryがどのようなものかを簡単に確認しておきましょう。

Dictionaryは、キーと値のペアを保存するコレクションです。キーを指定することで、対応する値に素早くアクセスできるのが特徴です。

例えば、ユーザーIDとユーザー名を関連付けて管理する場合、次のように使います。

Dictionary<int, string> users = new Dictionary<int, string>
{
  { 1, "山田太郎" },
  { 2, "佐藤花子" },
  { 3, "鈴木一郎" }
};

// キーを指定して値を取得
string userName = users[1];
Console.WriteLine(userName);
// 出力: 山田太郎

このように、キーを使って対応する値を効率的に取得できるのがDictionaryの大きな利点です。

Dictionaryをforeachでループする基本

Dictionaryの中身を順番に処理するには、foreachを使います。最も基本的な方法は、Dictionaryをそのままforeachでループする方法です。

Dictionary<int, string> users = new Dictionary<int, string>
{
  { 1, "山田太郎" },
  { 2, "佐藤花子" },
  { 3, "鈴木一郎" }
};

foreach (var item in users)
{
  Console.WriteLine($"キー: {item.Key}, 値: {item.Value}");
}

実行結果は以下のようになります。

キー: 1, 値: 山田太郎
キー: 2, 値: 佐藤花子
キー: 3, 値: 鈴木一郎

このコードでは、foreachでDictionaryをループする際、各要素がKeyValuePair<TKey, TValue>という型で取得されます。item.Keyでキーに、item.Valueで値にアクセスできます。

KeyValuePairを明示的に指定する

varキーワードの代わりに、KeyValuePair<TKey, TValue>を明示的に指定することもできます。

foreach (KeyValuePair<int, string> item in users)
{
  Console.WriteLine($"キー: {item.Key}, 値: {item.Value}");
}

型を明示することで、コードの可読性が向上する場合があります。特に、他の開発者がコードを読む際に、何の型を扱っているかが一目で分かります。

キーだけをループする方法

Dictionaryからキーだけを取り出したい場合は、Keysプロパティを使います。

Dictionary<int, string> users = new Dictionary<int, string>
{
  { 1, "山田太郎" },
  { 2, "佐藤花子" },
  { 3, "鈴木一郎" }
};

foreach (var key in users.Keys)
{
  Console.WriteLine($"キー: {key}");
}

実行結果は以下のようになります。

キー: 1
キー: 2
キー: 3

Keysプロパティは、Dictionary内のすべてのキーを含むコレクションを返します。このコレクションをforeachでループすることで、キーだけを順番に取得できます。

キーから値を取得する

キーだけをループする場合でも、必要に応じてキーから値を取得することができます。

foreach (var key in users.Keys)
{
  string value = users[key];
  Console.WriteLine($"キー: {key}, 値: {value}");
}

ただし、この方法はDictionaryを直接ループする方法と比べて、パフォーマンスが若干劣る可能性があります。キーを使って値を取得する処理が追加されるためです。

値だけをループする方法

逆に、値だけを取り出したい場合は、Valuesプロパティを使います。

Dictionary<int, string> users = new Dictionary<int, string>
{
  { 1, "山田太郎" },
  { 2, "佐藤花子" },
  { 3, "鈴木一郎" }
};

foreach (var value in users.Values)
{
  Console.WriteLine($"値: {value}");
}

実行結果は以下のようになります。

値: 山田太郎
値: 佐藤花子
値: 鈴木一郎

Valuesプロパティは、Dictionary内のすべての値を含むコレクションを返します。キーは不要で、値だけを処理したい場合に便利です。

Dictionaryループ時の注意点

Dictionaryをforeachでループする際には、いくつか注意すべき点があります。

ループ中にDictionaryを変更してはいけない

foreachでループしている最中に、Dictionaryに要素を追加したり削除したりすると、例外が発生します。

Dictionary<int, string> users = new Dictionary<int, string>
{
  { 1, "山田太郎" },
  { 2, "佐藤花子" }
};

// これはエラーになる
foreach (var item in users)
{
  if (item.Key == 1)
  {
    users.Add(3, "鈴木一郎"); // InvalidOperationException が発生
  }
}

このコードを実行すると、InvalidOperationExceptionという例外が発生します。

もしループ中に変更が必要な場合は、一旦ToList()でコピーを作成してからループします。

foreach (var item in users.ToList())
{
  if (item.Key == 1)
  {
    users.Add(3, "鈴木一郎"); // 正常に動作する
  }
}

ToList()を使うことで、Dictionaryのコピーがリストとして作成され、元のDictionaryを変更しても例外が発生しなくなります。

Dictionaryの順序は保証されない

Dictionaryは、要素を追加した順序を保証しません。foreachでループしたときの順序は、実装の詳細に依存します。

もし順序が重要な場合は、SortedDictionaryOrderByメソッドを使って並べ替える必要があります。

// キーでソートしてループ
foreach (var item in users.OrderBy(x => x.Key))
{
  Console.WriteLine($"キー: {item.Key}, 値: {item.Value}");
}

このようにすることで、キーの昇順で要素を処理できます。

パフォーマンスを考慮したループ方法

Dictionaryをループする際、パフォーマンスを考慮することも重要です。

推奨される方法:Dictionaryを直接ループ

最もパフォーマンスが良いのは、Dictionaryを直接foreachでループする方法です。

foreach (var item in users)
{
  Console.WriteLine($"キー: {item.Key}, 値: {item.Value}");
}

この方法は、余計なコレクションの作成や値の取得処理がないため、最も効率的です。

避けるべき方法:ElementAtを使ったforループ

ElementAt()メソッドを使ってインデックスでアクセスする方法は、パフォーマンスが非常に悪くなります。

// この方法は避けるべき
for (int i = 0; i < users.Count; i++)
{
  var item = users.ElementAt(i);
  Console.WriteLine($"キー: {item.Key}, 値: {item.Value}");
}

ElementAt()は内部で毎回最初から指定されたインデックスまで要素を辿るため、計算量がO(n²)になってしまいます。Dictionaryのサイズが大きくなると、処理時間が大幅に増加します。

実際のユースケース

それでは、実際の開発でよくある場面でのDictionaryのforeachループの例を見てみましょう。

ケース1:設定情報の表示

アプリケーションの設定情報をDictionaryで管理し、それを画面に表示する場合です。

Dictionary<string, string> appSettings = new Dictionary<string, string>
{
  { "ServerUrl", "https://example.com" },
  { "Timeout", "30" },
  { "MaxRetry", "3" }
};

Console.WriteLine("=== アプリケーション設定 ===");
foreach (var setting in appSettings)
{
  Console.WriteLine($"{setting.Key}: {setting.Value}");
}

このように、Dictionaryに保存された設定をすべて表示できます。

ケース2:データの集計

複数の商品の在庫数をDictionaryで管理し、合計を計算する場合です。

Dictionary<string, int> inventory = new Dictionary<string, int>
{
  { "りんご", 50 },
  { "バナナ", 30 },
  { "みかん", 40 }
};

int total = 0;
foreach (var item in inventory.Values)
{
  total += item;
}

Console.WriteLine($"合計在庫数: {total}");
// 出力: 合計在庫数: 120

値だけをループすることで、シンプルに合計を計算できます。

ケース3:条件に合う要素の抽出

特定の条件を満たす要素だけを処理する場合です。

Dictionary<int, string> users = new Dictionary<int, string>
{
  { 1, "山田太郎" },
  { 2, "佐藤花子" },
  { 3, "鈴木一郎" },
  { 4, "田中次郎" }
};

Console.WriteLine("IDが3以上のユーザー:");
foreach (var user in users)
{
  if (user.Key >= 3)
  {
    Console.WriteLine($"ID: {user.Key}, 名前: {user.Value}");
  }
}

foreachの中で条件判定を行うことで、必要な要素だけを処理できます。

LINQを使った応用的な処理

C#のLINQを使うと、Dictionaryに対してさらに高度な処理を行うことができます。

キーでフィルタリングする

Dictionary<int, string> users = new Dictionary<int, string>
{
  { 1, "山田太郎" },
  { 2, "佐藤花子" },
  { 3, "鈴木一郎" }
};

// キーが2以上の要素だけを取得
var filteredUsers = users.Where(x => x.Key >= 2);

foreach (var user in filteredUsers)
{
  Console.WriteLine($"ID: {user.Key}, 名前: {user.Value}");
}

Whereメソッドを使うことで、条件に合う要素だけを簡単に抽出できます。

値でソートする

// 値(名前)でソート
var sortedUsers = users.OrderBy(x => x.Value);

foreach (var user in sortedUsers)
{
  Console.WriteLine($"ID: {user.Key}, 名前: {user.Value}");
}

キーだけでなく、値を基準にしたソートも可能です。

キャリア形成/給与還元
ひとつひとつ真摯に向き合う企業
ONE_WEDGE社員募集

株式会社 ONE WEDGEでは、新たな仲間を募集しています!

私たちと一緒に、革新的で充実したキャリアを築きませんか?
当社は、従業員が仕事と私生活のバランスを大切にできるよう、充実した福利厚生を整えています。

  • 完全週休2日制(土日休み)で、祝日や夏季休暇、年末年始休暇もしっかり保証!
  • 様々な休暇制度(有給、慶弔、産前・産後、育児、バースデー休暇、有給6日取得で特別休暇付与)を完備!
  • 従業員の成長と健康を支援するための表彰制度、資格取得支援、健康促進手当など!
  • 生活を支えるテレワーク手当、記事寄稿手当、結婚祝金・出産祝金など、様々な手当を提供!
  • 自己啓発としての書籍購入制度や、メンバー間のコミュニケーションを深める交流費補助!
  • 成果に応じた決算賞与や、リファラル採用手当、AI手当など、頑張りをしっかり評価!
  • ワークライフバランスを重視し、副業もOK!

株式会社 ONE WEDGEでは、一人ひとりの従業員が自己実現できる環境を大切にしています。
共に成長し、刺激を与え合える仲間をお待ちしております。
あなたの能力と熱意を、ぜひ当社で発揮してください。
ご応募お待ちしております!

ホームページ、採用情報は下記ボタンからご確認ください!

応募、ご質問など、お問い合わせフォーム、またはX (旧Twitter)、InstagramのDMでお気軽にご相談ください♪

まとめ

C#のDictionaryをforeachでループする方法について、基本的な使い方から応用まで解説しました。

  • Dictionaryを直接foreachでループすると、キーと値の両方をKeyValuePairとして取得できます。
  • キーだけをループしたい場合はKeysプロパティを使います。
  • 値だけをループしたい場合はValuesプロパティを使います。
  • ループ中にDictionaryを変更すると例外が発生するため、ToList()でコピーを作成する必要があります。
  • パフォーマンスを考慮すると、Dictionaryを直接ループする方法が最も効率的です。
  • ElementAt()を使ったforループは計算量がO(n²)になるため避けるべきです。

Dictionaryのループ処理は、C#プログラミングにおける基本的なスキルの1つです。それぞれの方法の特徴と注意点を理解し、状況に応じて適切に使い分けることで、効率的で読みやすいコードを書くことができます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です