35. Transparent Identifier #from
from a in source
from b in source
from c in source
from d in source
from e in source
where a % 2 == 0 && b % 2 == 0 && c % 2 == 0
select string.Concat(a, b, c, d, e);
48. 空シーケンスと集計
例外出ます。
Aggregateはseedつければ回避可能
var empty = Enumerable.Empty<int>();
// InvalidOperationException
var product1 = empty.Aggregate((x, y) => x * y);
// 0
var product2 = empty.Aggregate(0, (x, y) => x * y);
// InvalidOperationException
var max = empty.Max();
// InvalidOperationException
var min = empty.Min();
// InvalidOperationException
var avg = empty.Average();
Sumは0
// 0
var sum = empty.Sum();
49. 空シーケンスとNullable(or class)
例外出ません。
// int?の空シーケンス
var empty = Enumerable.Empty<int?>();
null返します。
// InvalidOperationException
var product = empty.Aggregate((x, y) => x * y);
さすがにAggregateはダメ
この振る舞いが妥当なのか
は諸説あるとかないとか
極力、値を返すようにする、という観
点で見ればstructはデフォルト値がな
いからダメでclassならあるので返せる
から、と見たり
// null
var max = empty.Max();
// null
var min = empty.Min();
// null
var avg = empty.Average();
50. DefaultIfEmpty #割と忘れる
// Minが欲しいけどWhereでフィルタした結果Emptyになってしまう
// けど例外は避けたい!
// わざわざToArrayしてAnyで確認してから、とかも嫌!
var min = Enumerable.Range(1, 10)
.Where(x => x > 10)
.Cast<int?>() // Nullableにキャストして
.Min() ?? -1; // nullのままが嫌なら??で値を
// 素直にDefaultIfEmpty使いましょう:)
var min = Enumerable.Range(1, 10)
.Where(x => x > 10)
.DefaultIfEmpty(-1)
.Min();