50
知って得する C# LINQ to Objects編 株式会社ハ・ン・ド プログラマ 馬場翔太 http://baba-s.hatenablog.com/

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

Embed Size (px)

DESCRIPTION

 

Citation preview

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

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

株式会社ハ・ン・ド

プログラマ

馬場翔太

http://baba-s.hatenablog.com/

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

スライド内容

1. LINQ to Objectsとは

2. LINQ to Objectsの使用例

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

LINQ to Objectsとは

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

コレクションを扱うための新しい方法

for文やforeach文を使わず下記の様な処理が行えます

• 条件を満たす要素の数を取得

• 条件を満たす要素を抽出

• 条件を満たす最初の要素を取得

• 昇順にソート

• etc.

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

LINQ to Objectsを使うために必要なこと

using System.Linq;

この一行をソースコードの先頭に追加するだけです

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

「using System.Linq;」を追加すると…

配列やリストで多くの拡張メソッドが使用可能になります

• Count

• Where

• First

• OrderBy

• etc.

次のスライドから順番に紹介していきます

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

LINQ to Objectsの使用例

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

// 兵士の数を取得します

var result = 0;

foreach (var character in characters)

{

if (character.Job == "Soldier")

{

result++;

}

}

条件を満たす要素の数を取得する

従来のコーディング

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

// 兵士の数を取得します

var result = characters.Count(c => c.Job == "Soldier");

条件を満たす要素の数を取得する

Countメソッドを使用

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

// 兵士のみ取得します

var result = new List<Character>();

foreach (var character in characters)

{

if (character.Job == "Soldier")

{

result.Add(character);

}

}

条件を満たす要素を抽出する

従来のコーディング

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

// 兵士のみ取得します

var result = characters.Where(c => c.Job == "Soldier");

条件を満たす要素を抽出する

Whereメソッドを使用

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

// すべてのキャラクターから名前だけ取得します

var result = new List<string>();

foreach (var character in characters)

{

result.Add(character.Name);

}

要素を射影する

従来のコーディング

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

// すべてのキャラクターから名前だけ取得します

var result = characters.Select(c => c.Name);

要素を射影する

Selectメソッドを使用

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

// 全員が兵士かどうかを判断します

var result = true;

foreach (var character in characters)

{

if (character.Job != "Soldier")

{

result = false;

break;

}

}

すべての要素が条件を満たしているか

従来のコーディング

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

// 全員が兵士かどうかを判断します

var result = characters.All(c => c.Job == "Soldier");

すべての要素が条件を満たしているか

Allメソッドを使用

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

// 兵士が存在するかどうかを取得します

var result = false;

foreach (var character in characters)

{

if (character.Job == "Soldier")

{

result = true;

break;

}

}

いずれかの要素が条件を満たしているか

従来のコーディング

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

// 兵士が存在するかどうかを取得します

var result = characters.Any(c => c.Job == "Soldier");

いずれかの要素が条件を満たしているか

Anyメソッドを使用

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

// 先頭の兵士を取得します

Character result = null;

foreach (var character in characters)

{

if (character.Job == "Soldier")

{

result = character;

break;

}

}

条件を満たす最初の要素を取得する

従来のコーディング

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

// 先頭の兵士を取得します

var result = characters.First(c => c.Job == "Soldier");

条件を満たす最初の要素を取得する

Firstメソッドを使用

(条件を満たす要素がない場合は例外になります)

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

// 先頭の兵士を取得します

var result = characters.FirstOrDefault(c => c.Job == "Soldier");

条件を満たす最初の要素を取得する

FirstOrDefaultメソッドを使用

(条件を満たす要素がない場合は既定値を返します)

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

// 末尾の兵士を取得します

Character result = null;

for (int i = characters.Length - 1; i >= 0; i--)

{

if (characters[i].Job == "Soldier")

{

result = characters[i];

break;

}

}

条件を満たす最後の要素を取得する

従来のコーディング

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

// 末尾の兵士を取得します

var result = characters.Last(c => c.Job == "Soldier");

条件を満たす最後の要素を取得する

Lastメソッドを使用

(条件を満たす要素がない場合は例外になります)

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

// 末尾の兵士を取得します

var result = characters.LastOrDefault(c => c.Job == "Soldier");

条件を満たす最後の要素を取得する

LastOrDefaultメソッドを使用

(条件を満たす要素がない場合は既定値を返します)

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

var result = characters[characters.Length - 1];

最後の要素を取得する

従来のコーディング

Lastメソッドを使用

var result = characters.Last();

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

// すべてのキャラクターの中で

// 最も大きな力のパラメータを取得します

var result = 0;

foreach (var character in characters)

{

if (result < character.Power)

{

result = character.Power;

}

}

最大値を取得する

従来のコーディング

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

// すべてのキャラクターの中で

// 最も大きな力のパラメータを取得します

var result = characters.Max(c => c.Power);

最大値を取得する

Maxメソッドを使用

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

// すべてのキャラクターの中で

// 最も小さな力のパラメータを取得します

var result = int.MaxValue;

foreach (var character in characters)

{

if (character.Power < result)

{

result = character.Power;

}

}

最小値を取得する

従来のコーディング

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

// すべてのキャラクターの中で

// 最も小さな力のパラメータを取得します

var result = characters.Min(c => c.Power);

最小値を取得する

Minメソッドを使用

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

// 最も大きな力を持つキャラクターを取得します

int max = characters.Max(c => c.Power);

var result = characters.First(c => c.Power == max);

最大値を持つ要素を取得する

MaxメソッドとFirstメソッドを使用

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

// 最も大きな力を持つキャラクターをすべて取得します

int max = characters.Max(c => c.Power);

var result = characters.Where(c => c.Power == max);

最大値を持つ要素をすべて取得する

MaxメソッドとWhereメソッドを使用

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

// アイテムの購入金額を取得します

var result = 0;

foreach (var item in items)

{

result += item.Price;

}

合計値を取得する

従来のコーディング

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

// アイテムの購入金額を取得します

var result = items.Sum(c => c.Price);

合計値を取得する

Sumメソッドを使用

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

// アイテムの平均金額を取得します

var result = 0;

foreach (var item in items)

{

result += item.Price;

}

result /= items.Count;

平均値を取得する

従来のコーディング

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

// アイテムの平均金額を取得します

var result = items.Average(c => c.Price);

平均値を取得する

Averageメソッドを使用

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

// 錬金術士のみ錬金術を使います

foreach (var character in characters)

{

var result = character as Alchemist;

if (result != null)

{

result.Alchemy();

}

}

指定された型に一致する要素を抽出する

従来のコーディング

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

// 錬金術士のみ錬金術を使います

foreach (var result in characters.OfType<Alchemist>())

{

result.Alchemy();

}

指定された型に一致する要素を抽出する

OfTypeメソッドを使用

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

// すべてのフラグをONで初期化します

bool[] flags = new bool[100];

for (int i = 0; i < flags.Length; i++)

{

flags[i] = true;

}

配列を規定値で初期化する

従来のコーディング

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

// すべてのフラグをONで初期化します

bool[] flags = Enumerable.Repeat(true, 100).ToArray();

配列を規定値で初期化する

Repeatメソッドを使用

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

//最新の10件のプレゼントの一覧を取得します

var result = new List<Present>();

for (int i = 0; i < 10; i++)

{

result.Add(presents[i]);

}

指定された数の要素を取得する

従来のコーディング

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

//最新の10件のプレゼントの一覧を取得します

var result = presents.Take(10);

指定された数の要素を取得する

Takeメソッドを使用

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

// 11件目以降のプレゼントの一覧を取得します

var result = new List<Present>();

for (int i = 10; i < presents.Length; i++)

{

result.Add(presents[i]);

}

指定された数の要素を読み飛ばす

従来のコーディング

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

// 11件目以降のプレゼントの一覧を取得します

var result = presents.Skip(10);

指定された数の要素を読み飛ばす

Skipメソッドを使用

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

// 指定されたページに表示する

// プレゼントの一覧を取得します

var result = presents.Skip(page * 10).Take(10);

ページャーの機能を実装する

SkipメソッドとTakeメソッドを使用

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

// 価格が安い順にアイテムを取得します

var result = items.OrderBy(c => c.Price);

昇順にソートする

OrderByメソッドを使用

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

// 価格が安い順にアイテムを取得します

var result = items.OrderByDescending(c => c.Price);

降順にソートする

OrderByDescendingメソッドを使用

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

// アイテムの順番を逆転させます

var result = items.Reverse();

逆順にする

Reverseメソッドを使用

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

// 名前の重複を取り除きます

var result = names.Distinct();

重複を取り除く

Distinctメソッドを使用

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

まとめ

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

LINQ to Objectsを使用すると…

ソースコードを簡潔に記述できます

• for文が減る

• foreach文が減る

• if文が減る

• 変数が減る

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

ありがとうございました