06 linq
TRANSCRIPT
![Page 1: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/1.jpg)
LINQ
![Page 2: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/2.jpg)
Iterators
![Page 3: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/3.jpg)
Iteration
![Page 4: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/4.jpg)
Iteration
![Page 5: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/5.jpg)
What do we see
• It is imperative (repetitive, verbose etc.)– Sort of awkward
• This is “default” way to iterate data structure– Can be put into library
• But sometimes we want to iterate differently– Determined by business rules
![Page 6: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/6.jpg)
Custom iteration
![Page 7: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/7.jpg)
Custom iteration
![Page 8: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/8.jpg)
Custom iteration
![Page 9: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/9.jpg)
The problem
Given:• Data structure knows how to iterate
itself• Additionally, we want to define other
ways to iterate data structure
Goal:• Nice abstraction for that
![Page 10: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/10.jpg)
Solution
foreach loop
![Page 11: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/11.jpg)
![Page 12: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/12.jpg)
Agenda
• Manual iteration• …magic…• foreach iteration• …magic…• No iteration
![Page 13: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/13.jpg)
Iterator pattern
![Page 14: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/14.jpg)
Usage
![Page 15: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/15.jpg)
Implementation
Let’s implement ReverseEnumerator<T>
![Page 16: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/16.jpg)
ReverseEnumerator<T>
![Page 17: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/17.jpg)
ReverseEnumerator<T>
![Page 18: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/18.jpg)
Usage
![Page 19: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/19.jpg)
Let’s make usage code identical
![Page 20: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/20.jpg)
![Page 21: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/21.jpg)
Now compiler can do iteration
for us
![Page 22: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/22.jpg)
Iterators are lazy (deferred)
Let’s show it in debugger
![Page 23: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/23.jpg)
Iteration side effects are observed
each time the sequence is iterated
![Page 24: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/24.jpg)
Let’s see what else can compiler do for us
![Page 25: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/25.jpg)
![Page 26: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/26.jpg)
![Page 27: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/27.jpg)
![Page 28: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/28.jpg)
yield return – makes MoveNext() return true
![Page 29: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/29.jpg)
yield return is also lazy
Let’s check that in debugger
![Page 30: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/30.jpg)
yield return is lazy
![Page 31: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/31.jpg)
yield return is lazy
![Page 32: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/32.jpg)
yield break – makes MoveNext() return false
![Page 33: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/33.jpg)
IEnumerables are immutable
We cannot change the sequenceWe can only create new sequences
based on old ones
![Page 34: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/34.jpg)
![Page 35: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/35.jpg)
We can chain iterators
Remember, the sequence is lazy
![Page 36: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/36.jpg)
Infinite iterators
![Page 37: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/37.jpg)
Infinite iterators
![Page 38: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/38.jpg)
Let’s recall our goal
Given:• Data structure knows how to iterate
itself• Additionally, we want to define other
ways to iterate data structure
Goal:• Nice abstraction for that
![Page 39: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/39.jpg)
Iterate data structure
![Page 40: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/40.jpg)
![Page 41: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/41.jpg)
In fact, often we don’t need iteration at all
Typical tasks:• Find element(s) in sequence• Check if condition is true/false for all
elements• Transform sequence • Filter sequence• Aggregate sequence
![Page 42: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/42.jpg)
In these cases iteration is just an implementation detail
We can express what we want declaratively
![Page 43: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/43.jpg)
Generation
• Empty(), Range(), Repeat()
![Page 44: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/44.jpg)
Aggregation
• Aggregate(), All(), Any(), Average(), Contains(), Count(), Max(), Min(), Sum()
• ElementAt(), First(), Last(), Single()
![Page 45: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/45.jpg)
Transformation
• Cast(), OfType()• Concat(), Distinct(), Except(),
Intersect(), Reverse(), Union(), Zip()• Select(), SelectMany()• GroupBy()• OrderBy(), OrderByDescending()
![Page 46: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/46.jpg)
Filtration
• Skip(), SkipWhile(), TakeWhile(), Where()
![Page 47: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/47.jpg)
Anonymous types
![Page 48: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/48.jpg)
Extension methods are nice
But we’ve got something even better!
![Page 49: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/49.jpg)
LINQ(Language Integrated Queries)(a.k.a. query comprehensions)
![Page 50: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/50.jpg)
select
![Page 51: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/51.jpg)
where
![Page 52: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/52.jpg)
select + where
![Page 53: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/53.jpg)
select + where + anonymous types
![Page 54: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/54.jpg)
select many
![Page 55: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/55.jpg)
select many + where
![Page 56: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/56.jpg)
order by
![Page 57: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/57.jpg)
let
![Page 58: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/58.jpg)
group by
![Page 59: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/59.jpg)
group by
![Page 60: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/60.jpg)
Sum up
• Use LINQ and LINQ extension methods – to declaratively specify what you want – to simplify your code– to generalize your code– to create complex abstractions from
simple ones
• Remember that IEnumerables are lazy
![Page 61: 06 LINQ](https://reader033.vdocuments.us/reader033/viewer/2022052522/554eb9c7b4c905de468b45fc/html5/thumbnails/61.jpg)
Questions?