知って得するC# LINQ to Objects編

9,484 views

Published on

Published in: Technology
0 Comments
21 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,484
On SlideShare
0
From Embeds
0
Number of Embeds
465
Actions
Shares
0
Downloads
48
Comments
0
Likes
21
Embeds 0
No embeds

No notes for slide

知って得するC# LINQ to Objects編

  1. 1. 知って得する C# LINQ to Objects編 株式会社ハ・ン・ド プログラマ 馬場翔太 http://baba-s.hatenablog.com/
  2. 2. スライド内容 1. LINQ to Objectsとは 2. LINQ to Objectsの使用例
  3. 3. LINQ to Objectsとは
  4. 4. コレクションを扱うための新しい方法 for文やforeach文を使わず下記の様な処理が行えます • 条件を満たす要素の数を取得 • 条件を満たす要素を抽出 • 条件を満たす最初の要素を取得 • 昇順にソート • etc.
  5. 5. LINQ to Objectsを使うために必要なこと using System.Linq; この一行をソースコードの先頭に追加するだけです
  6. 6. 「using System.Linq;」を追加すると… 配列やリストで多くの拡張メソッドが使用可能になります • Count • Where • First • OrderBy • etc. 次のスライドから順番に紹介していきます
  7. 7. LINQ to Objectsの使用例
  8. 8. 条件を満たす要素の数を取得する 従来のコーディング // 兵士の数を取得します var result = 0; foreach (var character in characters) { if (character.Job == "Soldier") { result++; } }
  9. 9. 条件を満たす要素の数を取得する Countメソッドを使用 // 兵士の数を取得します var result = characters.Count(c => c.Job == "Soldier");
  10. 10. 条件を満たす要素を抽出する 従来のコーディング // 兵士のみ取得します var result = new List<Character>(); foreach (var character in characters) { if (character.Job == "Soldier") { result.Add(character); } }
  11. 11. 条件を満たす要素を抽出する Whereメソッドを使用 // 兵士のみ取得します var result = characters.Where(c => c.Job == "Soldier");
  12. 12. 要素を射影する 従来のコーディング // すべてのキャラクターから名前だけ取得します var result = new List<string>(); foreach (var character in characters) { result.Add(character.Name); }
  13. 13. 要素を射影する Selectメソッドを使用 // すべてのキャラクターから名前だけ取得します var result = characters.Select(c => c.Name);
  14. 14. すべての要素が条件を満たしているか 従来のコーディング // 全員が兵士かどうかを判断します var result = true; foreach (var character in characters) { if (character.Job != "Soldier") { result = false; break; } }
  15. 15. すべての要素が条件を満たしているか Allメソッドを使用 // 全員が兵士かどうかを判断します var result = characters.All(c => c.Job == "Soldier");
  16. 16. いずれかの要素が条件を満たしているか 従来のコーディング // 兵士が存在するかどうかを取得します var result = false; foreach (var character in characters) { if (character.Job == "Soldier") { result = true; break; } }
  17. 17. いずれかの要素が条件を満たしているか Anyメソッドを使用 // 兵士が存在するかどうかを取得します var result = characters.Any(c => c.Job == "Soldier");
  18. 18. 条件を満たす最初の要素を取得する 従来のコーディング // 先頭の兵士を取得します Character result = null; foreach (var character in characters) { if (character.Job == "Soldier") { result = character; break; } }
  19. 19. 条件を満たす最初の要素を取得する Firstメソッドを使用 (条件を満たす要素がない場合は例外になります) // 先頭の兵士を取得します var result = characters.First(c => c.Job == "Soldier");
  20. 20. 条件を満たす最初の要素を取得する FirstOrDefaultメソッドを使用 (条件を満たす要素がない場合は既定値を返します) // 先頭の兵士を取得します var result = characters.FirstOrDefault(c => c.Job == "Soldier");
  21. 21. 条件を満たす最後の要素を取得する 従来のコーディング // 末尾の兵士を取得します Character result = null; for (int i = characters.Length - 1; i >= 0; i--) { if (characters[i].Job == "Soldier") { result = characters[i]; break; } }
  22. 22. 条件を満たす最後の要素を取得する Lastメソッドを使用 (条件を満たす要素がない場合は例外になります) // 末尾の兵士を取得します var result = characters.Last(c => c.Job == "Soldier");
  23. 23. 条件を満たす最後の要素を取得する LastOrDefaultメソッドを使用 (条件を満たす要素がない場合は既定値を返します) // 末尾の兵士を取得します var result = characters.LastOrDefault(c => c.Job == "Soldier");
  24. 24. 最後の要素を取得する 従来のコーディング var result = characters[characters.Length - 1]; Lastメソッドを使用 var result = characters.Last();
  25. 25. 最大値を取得する 従来のコーディング // すべてのキャラクターの中で // 最も大きな力のパラメータを取得します var result = 0; foreach (var character in characters) { if (result < character.Power) { result = character.Power; } }
  26. 26. 最大値を取得する Maxメソッドを使用 // すべてのキャラクターの中で // 最も大きな力のパラメータを取得します var result = characters.Max(c => c.Power);
  27. 27. 最小値を取得する 従来のコーディング // すべてのキャラクターの中で // 最も小さな力のパラメータを取得します var result = int.MaxValue; foreach (var character in characters) { if (character.Power < result) { result = character.Power; } }
  28. 28. 最小値を取得する Minメソッドを使用 // すべてのキャラクターの中で // 最も小さな力のパラメータを取得します var result = characters.Min(c => c.Power);
  29. 29. 最大値を持つ要素を取得する MaxメソッドとFirstメソッドを使用 // 最も大きな力を持つキャラクターを取得します int max = characters.Max(c => c.Power); var result = characters.First(c => c.Power == max);
  30. 30. 最大値を持つ要素をすべて取得する MaxメソッドとWhereメソッドを使用 // 最も大きな力を持つキャラクターをすべて取得します int max = characters.Max(c => c.Power); var result = characters.Where(c => c.Power == max);
  31. 31. 合計値を取得する 従来のコーディング // アイテムの購入金額を取得します var result = 0; foreach (var item in items) { result += item.Price; }
  32. 32. 合計値を取得する Sumメソッドを使用 // アイテムの購入金額を取得します var result = items.Sum(c => c.Price);
  33. 33. 平均値を取得する 従来のコーディング // アイテムの平均金額を取得します var result = 0; foreach (var item in items) { result += item.Price; } result /= items.Count;
  34. 34. 平均値を取得する Averageメソッドを使用 // アイテムの平均金額を取得します var result = items.Average(c => c.Price);
  35. 35. 指定された型に一致する要素を抽出する 従来のコーディング // 錬金術士のみ錬金術を使います foreach (var character in characters) { var result = character as Alchemist; if (result != null) { result.Alchemy(); } }
  36. 36. 指定された型に一致する要素を抽出する OfTypeメソッドを使用 // 錬金術士のみ錬金術を使います foreach (var result in characters.OfType<Alchemist>()) { result.Alchemy(); }
  37. 37. 配列を規定値で初期化する 従来のコーディング // すべてのフラグをONで初期化します bool[] flags = new bool[100]; for (int i = 0; i < flags.Length; i++) { flags[i] = true; }
  38. 38. 配列を規定値で初期化する Repeatメソッドを使用 // すべてのフラグをONで初期化します bool[] flags = Enumerable.Repeat(true, 100).ToArray();
  39. 39. 指定された数の要素を取得する 従来のコーディング //最新の10件のプレゼントの一覧を取得します var result = new List<Present>(); for (int i = 0; i < 10; i++) { result.Add(presents[i]); }
  40. 40. 指定された数の要素を取得する Takeメソッドを使用 //最新の10件のプレゼントの一覧を取得します var result = presents.Take(10);
  41. 41. 指定された数の要素を読み飛ばす 従来のコーディング // 11件目以降のプレゼントの一覧を取得します var result = new List<Present>(); for (int i = 10; i < presents.Length; i++) { result.Add(presents[i]); }
  42. 42. 指定された数の要素を読み飛ばす Skipメソッドを使用 // 11件目以降のプレゼントの一覧を取得します var result = presents.Skip(10);
  43. 43. ページャーの機能を実装する SkipメソッドとTakeメソッドを使用 // 指定されたページに表示する // プレゼントの一覧を取得します var result = presents.Skip(page * 10).Take(10);
  44. 44. 昇順にソートする OrderByメソッドを使用 // 価格が安い順にアイテムを取得します var result = items.OrderBy(c => c.Price);
  45. 45. 降順にソートする OrderByDescendingメソッドを使用 // 価格が安い順にアイテムを取得します var result = items.OrderByDescending(c => c.Price);
  46. 46. 逆順にする Reverseメソッドを使用 // アイテムの順番を逆転させます var result = items.Reverse();
  47. 47. 重複を取り除く Distinctメソッドを使用 // 名前の重複を取り除きます var result = names.Distinct();
  48. 48. まとめ
  49. 49. LINQ to Objectsを使用すると… ソースコードを簡潔に記述できます • for文が減る • foreach文が減る • if文が減る • 変数が減る
  50. 50. ありがとうございました

×