Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
知って得する

C#

LINQ to Objects編
株式会社ハ・ン・ド
プログラマ
馬場翔太
http://baba-s.hatenablog.com/
スライド内容
1. LINQ to Objectsとは
2. LINQ to Objectsの使用例
LINQ to Objectsとは
コレクションを扱うための新しい方法
for文やforeach文を使わず下記の様な処理が行えます
• 条件を満たす要素の数を取得
• 条件を満たす要素を抽出
• 条件を満たす最初の要素を取得

• 昇順にソート
• etc.
LINQ to Objectsを使うために必要なこと
using System.Linq;
この一行をソースコードの先頭に追加するだけです
「using System.Linq;」を追加すると…
配列やリストで多くの拡張メソッドが使用可能になります
• Count
• Where
• First

• OrderBy
• etc.
次のスライドから順番に紹介していきます
LINQ to Objectsの使用例
条件を満たす要素の数を取得する
従来のコーディング
// 兵士の数を取得します
var result = 0;
foreach (var character in characters)
{
if (character.Job == "Sold...
条件を満たす要素の数を取得する
Countメソッドを使用

// 兵士の数を取得します
var result = characters.Count(c => c.Job == "Soldier");
条件を満たす要素を抽出する
従来のコーディング
// 兵士のみ取得します
var result = new List<Character>();
foreach (var character in characters)
{
if (chara...
条件を満たす要素を抽出する
Whereメソッドを使用

// 兵士のみ取得します
var result = characters.Where(c => c.Job == "Soldier");
要素を射影する
従来のコーディング
// すべてのキャラクターから名前だけ取得します
var result = new List<string>();
foreach (var character in characters)
{
result...
要素を射影する
Selectメソッドを使用

// すべてのキャラクターから名前だけ取得します
var result = characters.Select(c => c.Name);
すべての要素が条件を満たしているか
従来のコーディング
// 全員が兵士かどうかを判断します
var result = true;
foreach (var character in characters)
{
if (character.Jo...
すべての要素が条件を満たしているか
Allメソッドを使用

// 全員が兵士かどうかを判断します
var result = characters.All(c => c.Job == "Soldier");
いずれかの要素が条件を満たしているか
従来のコーディング
// 兵士が存在するかどうかを取得します
var result = false;
foreach (var character in characters)
{
if (characte...
いずれかの要素が条件を満たしているか
Anyメソッドを使用

// 兵士が存在するかどうかを取得します
var result = characters.Any(c => c.Job == "Soldier");
条件を満たす最初の要素を取得する
従来のコーディング
// 先頭の兵士を取得します
Character result = null;
foreach (var character in characters)
{
if (character.J...
条件を満たす最初の要素を取得する
Firstメソッドを使用
(条件を満たす要素がない場合は例外になります)
// 先頭の兵士を取得します
var result = characters.First(c => c.Job == "Soldier"...
条件を満たす最初の要素を取得する
FirstOrDefaultメソッドを使用
(条件を満たす要素がない場合は既定値を返します)
// 先頭の兵士を取得します
var result = characters.FirstOrDefault(c =>...
条件を満たす最後の要素を取得する
従来のコーディング
// 末尾の兵士を取得します
Character result = null;
for (int i = characters.Length - 1; i >= 0; i--)
{
if (...
条件を満たす最後の要素を取得する
Lastメソッドを使用
(条件を満たす要素がない場合は例外になります)
// 末尾の兵士を取得します
var result = characters.Last(c => c.Job == "Soldier");
条件を満たす最後の要素を取得する
LastOrDefaultメソッドを使用
(条件を満たす要素がない場合は既定値を返します)
// 末尾の兵士を取得します
var result = characters.LastOrDefault(c => c...
最後の要素を取得する
従来のコーディング
var result = characters[characters.Length - 1];

Lastメソッドを使用
var result = characters.Last();
最大値を取得する
従来のコーディング
// すべてのキャラクターの中で
// 最も大きな力のパラメータを取得します
var result = 0;
foreach (var character in characters)
{
if (resu...
最大値を取得する
Maxメソッドを使用

// すべてのキャラクターの中で
// 最も大きな力のパラメータを取得します
var result = characters.Max(c => c.Power);
最小値を取得する
従来のコーディング
// すべてのキャラクターの中で
// 最も小さな力のパラメータを取得します
var result = int.MaxValue;
foreach (var character in characters)...
最小値を取得する
Minメソッドを使用

// すべてのキャラクターの中で
// 最も小さな力のパラメータを取得します
var result = characters.Min(c => c.Power);
最大値を持つ要素を取得する
MaxメソッドとFirstメソッドを使用

// 最も大きな力を持つキャラクターを取得します
int max = characters.Max(c => c.Power);
var result = characte...
最大値を持つ要素をすべて取得する
MaxメソッドとWhereメソッドを使用

// 最も大きな力を持つキャラクターをすべて取得します
int max = characters.Max(c => c.Power);
var result = ch...
合計値を取得する
従来のコーディング
// アイテムの購入金額を取得します
var result = 0;
foreach (var item in items)
{
result += item.Price;
}
合計値を取得する
Sumメソッドを使用

// アイテムの購入金額を取得します
var result = items.Sum(c => c.Price);
平均値を取得する
従来のコーディング
// アイテムの平均金額を取得します
var result = 0;
foreach (var item in items)
{
result += item.Price;
}
result /= item...
平均値を取得する
Averageメソッドを使用

// アイテムの平均金額を取得します
var result = items.Average(c => c.Price);
指定された型に一致する要素を抽出する
従来のコーディング
// 錬金術士のみ錬金術を使います
foreach (var character in characters)
{
var result = character as Alchemist...
指定された型に一致する要素を抽出する
OfTypeメソッドを使用

// 錬金術士のみ錬金術を使います
foreach (var result in characters.OfType<Alchemist>())
{
result.Alchem...
配列を規定値で初期化する
従来のコーディング
// すべてのフラグをONで初期化します
bool[] flags = new bool[100];
for (int i = 0; i < flags.Length; i++)
{
flags[i...
配列を規定値で初期化する
Repeatメソッドを使用

// すべてのフラグをONで初期化します
bool[] flags = Enumerable.Repeat(true, 100).ToArray();
指定された数の要素を取得する
従来のコーディング
//最新の10件のプレゼントの一覧を取得します
var result = new List<Present>();
for (int i = 0; i < 10; i++)
{
result.A...
指定された数の要素を取得する
Takeメソッドを使用

//最新の10件のプレゼントの一覧を取得します
var result = presents.Take(10);
指定された数の要素を読み飛ばす
従来のコーディング
// 11件目以降のプレゼントの一覧を取得します
var result = new List<Present>();
for (int i = 10; i < presents.Length;...
指定された数の要素を読み飛ばす
Skipメソッドを使用

// 11件目以降のプレゼントの一覧を取得します
var result = presents.Skip(10);
ページャーの機能を実装する
SkipメソッドとTakeメソッドを使用

// 指定されたページに表示する
// プレゼントの一覧を取得します
var result = presents.Skip(page * 10).Take(10);
昇順にソートする
OrderByメソッドを使用

// 価格が安い順にアイテムを取得します
var result = items.OrderBy(c => c.Price);
降順にソートする
OrderByDescendingメソッドを使用

// 価格が安い順にアイテムを取得します
var result = items.OrderByDescending(c => c.Price);
逆順にする
Reverseメソッドを使用

// アイテムの順番を逆転させます
var result = items.Reverse();
重複を取り除く
Distinctメソッドを使用

// 名前の重複を取り除きます
var result = names.Distinct();
まとめ
LINQ to Objectsを使用すると…
ソースコードを簡潔に記述できます
• for文が減る
• foreach文が減る
• if文が減る

• 変数が減る
ありがとうございました
Nächste SlideShare
Wird geladen in …5
×

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

11.656 Aufrufe

Veröffentlicht am

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

知って得する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. ありがとうございました

×