c# linq

23
LINQ 2013年10月12日 Presented By: Jimmy Rishe, InfoPath MVP

Upload: jameslrishe

Post on 17-Jul-2015

631 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: C# linq

LINQ

2013年10月12日Presented By: Jimmy Rishe,

InfoPath MVP

Page 2: C# linq

LINQ

• Language Integrated Queries (統合言語クエリ)

• 配列、リスト、コレクションなどから簡潔に値を求めたり、変換したり、操ったりするための仕組み。

• .NET 3.5, C# 3.0, VB 2008に含まれている。

• 関数型言語によく使われる概念に基づいている。

Page 3: C# linq

高階関数

LINQ 他の言語で使われる別名

Select map

Where filter

Aggregate fold

All forall

Any exists

OrderBy sortBy

Page 4: C# linq

数学関数

Max

Min

Sum

Average

Page 5: C# linq

IEnumerable<T>の拡張メソッド

• 本来、インタフェースはメソッドを定義できない(宣伝だけ)

• そして、宣伝したメソッドを定義しないといけない

• しかし、C#3.0の拡張メソッドによって、以上の制限を回避し、LINQを使える

• つまり、IEnumerable<T>のGetEnumerator()を定義するクラスがあれば、LINQの機能が使える

Page 6: C# linq

匿名(ラムダ)関数(a, b, c) => { var d = a + b; return d * c; }

関数本体が一行の場合、{}とreturnと;を省略できる

(a, b, c) => { return (a + b) * c; }

(a, b, c) => (a + b) * c

引数が一つしかない場合、左側の()も省略できる

(a) => a + 7 < 0

a => a + 7 < 0

Page 7: C# linq

LINQ実例1

public class TestResult

{

public string TestTaker { get; set; }

public double TotalQuestions { get; set; }

public double TotalCorrect { get; set; }

}

List<TestResult>から点数(パーセンテージ)を求める

Page 8: C# linq

LINQ無しの場合

List<double> scores = new List<double>();

foreach (TestResult result in tests)

{

scores.Add(result.TotalCorrect /result.TotalQuestions);

}

IEnumerable<T>.Select(T => R) IEnumerable<R>

Page 9: C# linq

LINQの場合

var scores = tests.Select(t => t.TotalCorrect / t.TotalQuestions);

Page 10: C# linq

こんな書き方もあります

Page 11: C# linq

LINQ実例2

各テストの点数と受験者名を求める

Page 12: C# linq

LINQ無しの場合class TestScore

{ public double Score { get; set; }

public string TestTaker { get; set; }

}

List<TestScore> scores = new List<TestScore>();

foreach (TestResult test in tests)

{

scores.Add(new TestScore

{

Score = test.TotalCorrect / test.TotalQuestions,

TestTaker = test.TestTaker

});

}

Page 13: C# linq

LINQの場合

var scores2 = tests.Select(t => new

{

Score = t.TotalCorrect / t.TotalQuestions,

TestTaker = t.TestTaker

});

Page 14: C# linq

LINQ実例3

点数が80%以上のテストのみを求める

Page 15: C# linq

LINQ無しの場合

List<TestScore> highTests = new List<TestScore>();

foreach (TestResult test in tests)

{

if(test.TotalCorrect / test.TotalQuestions >= 80)

{

highTests.Add(test);

}

}

Page 16: C# linq

LINQの場合

var highTests =

sampleTests.Where(t => t.TotalCorrect /

t.TotalQuestions >= 0.6);

IEnumerable<T>.Where(T => bool) IEnumerable<T>

Page 17: C# linq

LINQ実例4

点数が60%以上のテストの受験者名と点数を求める

Page 18: C# linq

LINQ無しの場合

List<TestScore> highTests = new List<TestScore>();

foreach (TestResult test in tests)

{

double score = test.TotalCorrect / test.TotalQuestions;

if(score >= 0.6)

{

highTests.Add(new TestScore

{

TestTaker = test.TestTaker, Score = score

});

}

}

Page 19: C# linq

LINQの場合

var highScores = sampleTests.Select(t => new

{

t.TestTaker,

Score = t.TotalCorrect / t.TotalQuestions

})

.Where(s => s.Score >= 0.6);

Page 20: C# linq

LINQ実例5

点数が60%以上のテストの受験者名と点数を点数順に求める

Page 21: C# linq

LINQの場合

var highScores = sampleTests

.Select(t => new

{

t.TestTaker,

Score = t.TotalCorrect / t.TotalQuestions

})

.Where(s => s.Score >= 0.6)

.OrderBy(s => s.Score);

IEnumerable<T>.OrderBy(T => O) IEnumerable<T>

Page 22: C# linq

他には

Aggregate 要素を全て組み合わせて、一つの値に変換する

All 要素が全て何かの条件を満たすかどうかを調べる

Any 一つ以上の要素何かの条件を満たすかどうかを調べる

Sum 要素の和を計算する

Max 最大の要素を求める

Min 最小の要素を求める

Average 要素の平均値を計算する

Page 23: C# linq

ご清聴をありがとうございました