If I got a input sequence like { 1, 2, 3, 6, 7, 8, 11, 12, 13, 145 }, how can you group them into some group where each group only contain continuous numbers.
Please do not use for-loop, try to think the input like a single unit, a output from a function. Here is the solution:
var groups = input.Zip(Enumerable.Range(1, input.Length), (i, n) => new { i, GroupNumber=n-i }).GroupBy(m => m.GroupNumber, m => m.i);
how does think work?
It use another continuous output as mirror to help group the input.
I found the way to write a good LINQ query or thinking in functional way is to compare the input and output and trying to find the different. You always think the input as a whole entity. After applying some functions, can easily prove the whole program is correct or not. that's the beauty of functional. I do not know a way to make a FOR loop into a nice math formula, maybe that's why I am always afraid of FOR loop.
The above sample give me a new way to design functional program by introducing another sequence or entity. I love functional!
No comments:
Post a Comment