61
LINQ

06 LINQ

Embed Size (px)

Citation preview

Page 1: 06 LINQ

LINQ

Page 2: 06 LINQ

Iterators

Page 3: 06 LINQ

Iteration

Page 4: 06 LINQ

Iteration

Page 5: 06 LINQ

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

Custom iteration

Page 7: 06 LINQ

Custom iteration

Page 8: 06 LINQ

Custom iteration

Page 9: 06 LINQ

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

Solution

foreach loop

Page 11: 06 LINQ
Page 12: 06 LINQ

Agenda

• Manual iteration• …magic…• foreach iteration• …magic…• No iteration

Page 13: 06 LINQ

Iterator pattern

Page 14: 06 LINQ

Usage

Page 15: 06 LINQ

Implementation

Let’s implement ReverseEnumerator<T>

Page 16: 06 LINQ

ReverseEnumerator<T>

Page 17: 06 LINQ

ReverseEnumerator<T>

Page 18: 06 LINQ

Usage

Page 19: 06 LINQ

Let’s make usage code identical

Page 20: 06 LINQ
Page 21: 06 LINQ

Now compiler can do iteration

for us

Page 22: 06 LINQ

Iterators are lazy (deferred)

Let’s show it in debugger

Page 23: 06 LINQ

Iteration side effects are observed

each time the sequence is iterated

Page 24: 06 LINQ

Let’s see what else can compiler do for us

Page 25: 06 LINQ
Page 26: 06 LINQ
Page 27: 06 LINQ
Page 28: 06 LINQ

yield return – makes MoveNext() return true

Page 29: 06 LINQ

yield return is also lazy

Let’s check that in debugger

Page 30: 06 LINQ

yield return is lazy

Page 31: 06 LINQ

yield return is lazy

Page 32: 06 LINQ

yield break – makes MoveNext() return false

Page 33: 06 LINQ

IEnumerables are immutable

We cannot change the sequenceWe can only create new sequences

based on old ones

Page 34: 06 LINQ
Page 35: 06 LINQ

We can chain iterators

Remember, the sequence is lazy

Page 36: 06 LINQ

Infinite iterators

Page 37: 06 LINQ

Infinite iterators

Page 38: 06 LINQ

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

Iterate data structure

Page 40: 06 LINQ
Page 41: 06 LINQ

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

In these cases iteration is just an implementation detail

We can express what we want declaratively

Page 43: 06 LINQ

Generation

• Empty(), Range(), Repeat()

Page 44: 06 LINQ

Aggregation

• Aggregate(), All(), Any(), Average(), Contains(), Count(), Max(), Min(), Sum()

• ElementAt(), First(), Last(), Single()

Page 45: 06 LINQ

Transformation

• Cast(), OfType()• Concat(), Distinct(), Except(),

Intersect(), Reverse(), Union(), Zip()• Select(), SelectMany()• GroupBy()• OrderBy(), OrderByDescending()

Page 46: 06 LINQ

Filtration

• Skip(), SkipWhile(), TakeWhile(), Where()

Page 47: 06 LINQ

Anonymous types

Page 48: 06 LINQ

Extension methods are nice

But we’ve got something even better!

Page 49: 06 LINQ

LINQ(Language Integrated Queries)(a.k.a. query comprehensions)

Page 50: 06 LINQ

select

Page 51: 06 LINQ

where

Page 52: 06 LINQ

select + where

Page 53: 06 LINQ

select + where + anonymous types

Page 54: 06 LINQ

select many

Page 55: 06 LINQ

select many + where

Page 56: 06 LINQ

order by

Page 57: 06 LINQ

let

Page 58: 06 LINQ

group by

Page 59: 06 LINQ

group by

Page 60: 06 LINQ

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

Questions?