Scan?

いつかの記事が、何とNyaRuRuさんに取り上げて頂いて 前後の値も利用したシーケンス処理 - NyaRuRuの日記 嬉しさのあまり卒倒しつつ恥ずかしさでいっぱいな今日この頃。

int[] array = { 1, 2, 4, 4, 3, 3, 4, 0, 0 };

var result = array
    .OfType<Nullable<int>>()
    .Scan(new Tuple<int?, int?>(), (t, x) => Make.Tuple(t.Item2, x))
    .Skip(1)
    .Where(t => t.Item1 != t.Item2)
    .Select(t => t.Item2.Value);

Pairwiseを使う、などの発想が全くなかったので確認のためAchiralを使って書き直し。ただ、何だか怪しい。Scanを使うと、seedの分が一つ余計なのでSkip(1)はしょうがない、はず。一つズらすのでペアが出来ないところをNullableで補うのも必要、な、はず。はずなんだけど何だか違和感が拭えない。うーん。

intという、型を明示していくのが非常に書きにくい。これが違和感の元なのかな、普通にLINQで書くときはあまりないシチュエーションなので。ただ、こればっかりはしょうがない気がする。Nullableでなくても、空のTuple作るときに型が必要だから。んー、そもそも、Nullableにしなければもう少し綺麗になるような。ScanのseedをMake.Tuple(int.MinValue,int.MinValue)にでもすれば……。でもそれはそれで納得が行かない気がする。うーん、すっきりしない。

Profile

Yoshifumi Kawai

Cysharp, Inc
CEO/CTO

Microsoft MVP for Developer Technologies(C#)
April 2011
|
July 2023

Twitter:@neuecc GitHub:neuecc

Archive