c# linq
TRANSCRIPT
LINQ
2013年10月12日Presented By: Jimmy Rishe,
InfoPath MVP
LINQ
• Language Integrated Queries (統合言語クエリ)
• 配列、リスト、コレクションなどから簡潔に値を求めたり、変換したり、操ったりするための仕組み。
• .NET 3.5, C# 3.0, VB 2008に含まれている。
• 関数型言語によく使われる概念に基づいている。
高階関数
LINQ 他の言語で使われる別名
Select map
Where filter
Aggregate fold
All forall
Any exists
OrderBy sortBy
数学関数
Max
Min
Sum
Average
IEnumerable<T>の拡張メソッド
• 本来、インタフェースはメソッドを定義できない(宣伝だけ)
• そして、宣伝したメソッドを定義しないといけない
• しかし、C#3.0の拡張メソッドによって、以上の制限を回避し、LINQを使える
• つまり、IEnumerable<T>のGetEnumerator()を定義するクラスがあれば、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
LINQ実例1
public class TestResult
{
public string TestTaker { get; set; }
public double TotalQuestions { get; set; }
public double TotalCorrect { get; set; }
}
List<TestResult>から点数(パーセンテージ)を求める
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>
LINQの場合
var scores = tests.Select(t => t.TotalCorrect / t.TotalQuestions);
こんな書き方もあります
LINQ実例2
各テストの点数と受験者名を求める
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
});
}
LINQの場合
var scores2 = tests.Select(t => new
{
Score = t.TotalCorrect / t.TotalQuestions,
TestTaker = t.TestTaker
});
LINQ実例3
点数が80%以上のテストのみを求める
LINQ無しの場合
List<TestScore> highTests = new List<TestScore>();
foreach (TestResult test in tests)
{
if(test.TotalCorrect / test.TotalQuestions >= 80)
{
highTests.Add(test);
}
}
LINQの場合
var highTests =
sampleTests.Where(t => t.TotalCorrect /
t.TotalQuestions >= 0.6);
IEnumerable<T>.Where(T => bool) IEnumerable<T>
LINQ実例4
点数が60%以上のテストの受験者名と点数を求める
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
});
}
}
LINQの場合
var highScores = sampleTests.Select(t => new
{
t.TestTaker,
Score = t.TotalCorrect / t.TotalQuestions
})
.Where(s => s.Score >= 0.6);
LINQ実例5
点数が60%以上のテストの受験者名と点数を点数順に求める
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>
他には
Aggregate 要素を全て組み合わせて、一つの値に変換する
All 要素が全て何かの条件を満たすかどうかを調べる
Any 一つ以上の要素何かの条件を満たすかどうかを調べる
Sum 要素の和を計算する
Max 最大の要素を求める
Min 最小の要素を求める
Average 要素の平均値を計算する
ご清聴をありがとうございました