►
From YouTube: JSON DOM (2) and Index/Range methods for Linq
Description
Powered by Restream https://restream.io/
A
Internally
is
stored
as
a
adjacent
element.
I
mean
that's,
not
obvious,
but
we,
but
that's
why
we
have
this
get
value
of
t.
If
we
ever
change
internal
implementation,
it
would
still
work.
B
Right,
yeah
interesting,
so
the
so
I
guess
the
other
methods
you
get
from
ilist
and-
and
I
dictionary
is
all
the
mutation
things
right,
add
or
remove
right,
which
presumably
are
all
public
apis
not
explicitly
implemented.
So
you
can
actually
add
a
member
to
an
array.
Remove
a
member
from
an
array-
and
you
know.
A
That
works
awesome
with
dynamic,
because
you
know
you
just
call
add
or
remove
or
whatever
you
want
on
it,
and
you
know
we'll
it'll
just
find
those
methods
on
you
know
I
list
or
I
dictionary
if
you're
not
using
dynamic,
you
have
to
then
know
it's
a
json
array
or
json
object.
You
know
or
cast
I
list
or
I
dictionary.
If
you
want
and
then
call
add.
B
Yeah,
I
guess
I
need
to
think
a
little
bit
more
but
like
normally
when
you
have
a
dom
like
there
is
again.
I
guess
I
have
to
look
at
sample
code
like
I
have
a
hard
time
seeing
because
logically,
it
seems
like
all
the
interactions
are
likely
going
through
json
node,
because
well
that's
just
the
way.
Things
are
right,
because
that's
the
gives
you
the
indexer
for
everything
and
then,
when
you
want
to
mute
it,
you
would
have
to
downcast
to
the
appropriate
parent
container
in
order
to.
B
Do
any
meaningful
modifications,
it
also
seems
your
dom
does
not
have
a
parent
pointer
right.
You
can
only
get
to
children
right,
but
not
to
the.
B
B
I
guess
my
other
question
is
like
you
have
an
indexer
on
jason.
No,
that
gives
you
an
index,
but
how
do
I
get
the
count
or
length
for
that
matter?.
A
A
Again,
the
indexer
was
recently
added
based
upon
feedback
where
it
was
too
difficult
and
too
verbose.
I
guess
to
navigate
down
a
hierarchy
so.
B
You
know,
I
don't
know,
keep
it
like,
like
a
collection
with
like
key
value
pairs,
or
you
know
the
actual
keys
you
can
pass
in.
I
mean
I
guess
for
keys.
I
can
kind
of
buy
that
the
idea
is
you
know
it
already,
so
you
you
know
you
pass
in
name
or
first
name,
but
for
an
array
it
seems
weird
that
you
know
the
dimensions
up
front.
B
Like
I
mean
most
of
the
time,
I
would
think
an
array
is
unbounded,
so
you
would
think
it
can
have
n
number
of
elements,
and
I
have
no
idea
how
many
elements
it
has
in
practice
versus
for
the
for
the
for
the
key
values
it's
like.
Well,
you
know
this
is
my
schema,
so
I
expect
them
to
have
first
name
and
last
name
and
an
address
property
right,
but
for
the
for
the
for
the
array,
I
would
think
a
length
would
be
probably
necessary
if
you
want
to
make
that.
B
A
Okay,
if
you
want
to
scroll
down
to
the
next
section,
I
think
I
have
some
examples.
A
A
Yeah,
it's
just
showing
very
short
samples
on
on
how
to
call.
A
Serialize,
nothing
too
surprising
here,
however,
this
section
is
there
because
there
is
a
serialized
method
added
to
jason
node.
That
is
a
helper,
and
so
I
have
equivalent
longer
versions
here
like
if
you
didn't
have
this
helper.
A
A
B
Okay,
yeah,
I
don't
have
super
strong
opinions.
I
just
have
this
gut
feel.
As
I
said
earlier
like
to
me,
the
it
seems
a
bit
weird
that
the
dom
holds
on
to
serializer
options
and
you
know
implements
effectively
civilization
itself.
That
seems
surprising
to
me,
I'm
not
saying
it's
wrong,
it's
just
what
I
would
not
intuitively
expect.
I
would
expect
the
sea
level
to
be
kind
of
like
you
know.
B
B
Know
I
think
I
think
you
want
civilization
support.
I
mean
like
if
you
still
has
a
dom.
You
would
expect
that
to
go
out
as
jason
right,
so
I
think
the
city
that
would
have
to
special
case
the
dom,
no
matter
what.
But
I
would
say
as
the
as
the
entry
point,
I
find
it
weird
to
deselect
as
the
only
way
to
get
the
dom.
B
B
I'm
I'm
wrong.
I
just
think
it's
cheaper.
It
might
also
not
be
true
but
like
it
seems
to
me,
like
you
know,
the
jason
is
just
you
know
effectively
just
parsing
or
the
dome
is
just
parsing
right,
so
it's
just
basically
going
through
the
reader
and
then
constructs
objects
as
it
does
it,
which
is
like.
I
would
think
much
cheaper
than
going
through
civilization,.
A
Yeah,
I
I
I
hear
what
you're
saying
definitely
the
jason
element
and
jason
document
types
already
have
parse
methods
and
there's
you
know,
there's
a
lot
of
them.
There's
like
right,
dozens
of
them,
or
at
least
a
dozen
and
it's
possible.
You
know
to
use
those
and
then
pass
that
in
as
the
value,
if
you
want.
I
don't
think
I
show
any
examples
of
that.
Whether
we
want
to
have
you
know
mirror
that
those
parse
methods
on
this
type.
You
know
I'm
completely
open
to
that.
A
B
Yeah,
I
guess
a
very
common
example
where
you
wouldn't
call
ciolas
directly
would
be
you
have.
You
know,
let's
say
your
actual
object
like
customer
or
whatever,
and
then
you
have
this.
You
know
json
object
directly
on
the
customer
as
here's,
my
fallback
for
all
the
other
json
stuff.
I
don't
want
to
talk
about
in
my
api
and
you
would
expect
that
to
work
properly
right.
So
in
this
case
people
wouldn't
directly
call
your
list
of
json
object.
B
A
A
This
section
is
just
saying
based
upon
discussion
that
we're
not
going
to
add
any
cast
operators
by
by
default.
I
mean
I
decline
a
record.
B
A
Yeah-
and
this
has
been
different
than
other
implementations
that
have
casts
and
and
of
course
you
can
only
have
the
implicit
and
explicit
casts
if
you
know
what
the
other
type
is
right
and
since
this
type
supports
are,
since
this
programming
model
supports
custom
converters,
where
you
can
bring
your
own
type
and
your
own
conversion,
you
know
it
wouldn't
work
with
any
of
those.
A
But
if
you
don't
care
about
the
performance
hit
from
dynamic,
you
know
the
large
assembly
in
the
runtime
performance.
You
know
you
pretty
much.
You
can
do
whatever
you
want
at
runtime.
Regarding
casting,
I
mean
as
long
as
basically
as
long
as
c
sharp
understands
the
type
that
you're
trying
to
convert
to
either
because
the
variable
is
of
a
certain
type
or
you
add
an
explicit
cast,
then
you
know
it'll
just
do
that,
for
you.
B
Yeah,
I
think
it
has
been
a
while,
but
I
think,
last
time
I
looked
at
json.net,
I
believe
the
dom
supports
explicit
cast,
so
you
can
effectively
fish
out
a
string
or
an
in
directly
by
just
casting
that
is
not,
I
would
say,
intuitive,
but
looking
at
the
api.
So
I
think
it's
always
good
to
have
a
get
value
of
t
method
so
that
you
or
you
know,
I
think
he
calls
it
value
of
t
or
whatever,
but
like
basically
strongly
typed
api
to
get
that.
B
But
you
know
once
I
saw
a
sample
code
where
he
did
explicit
cards,
it
was
actually
somewhat
readable.
It
looked
somewhat
better
than
the
get
value
in
between.
So
that's
what
I'm
saying,
I
think
I'm
I'm
personally
open
to
explicit
cast
because
they
still
occur,
and
you
know
the
failure.
Points
are
clear
in
your
code,
but
yeah
implicit
costs
seem
very
bad.
B
The
only
thing
I'm
not
sure
of
because
I
don't
understand
necessarily
like
what
that
means
is
the
idea
that
you
can
cast
to
custom
types,
because
it
seems
again,
maybe
just
some
weird
but
like
it
seems
odd
to
me
that
I
can,
you
know,
navigate
the
dominance.
I'm
doing
that
also
dco
lies
into
my
custom
types.
That
seems,
I
guess
surprising
to
me,
but.
B
C
I
guess
if
value
returns
object,
but
then
it's
still
going
to
do
just
a
runtime
cast.
It's
not
going
to
do
a
dispatch
or
a
change
type
or
anything.
B
C
B
A
I
think
the
way
I
have
it
here
is
that
json
array
of
sub
index
one
or
index
one
here
you're
creating
the
json
value
of
a
custom
data
type
and
then,
when
you're
accessing
that
in
the
line
highlighted
you're
asking
for
the
raw
value.
D
C
C
On
the
indexer
to
turn
it
back
into
an
object
returning
one
instead
of
a
json
node
one
right,
so
the.
A
The
next
line
that
says
order
to
support
a
possible
conversion
is
is,
is
a
call
to
get
value
where
you
specify
the
t,
assuming
that
the
value
is
convertible,
then
you,
instead
of
a
cast,
which
you
know,
would
only
compile
or
run
time
and
only
work.
A
If
you
specified
the
actual
type,
the
get
value
would
support
a
conversion
in
theory
the
next
you
know,
basically
the
next
line
of
code
that
you
have
highlighted.
D
A
B
Yeah,
I
guess
I
I
would
generally
expect
explicit
costs
only
for,
like
you
know,
primitive
types
right
like
things
you
that
are
basically
part
of
the
json
schema
right
strings
ins.
Floats
doubles
right
things
there
we
have
intrinsic
understanding
for
everything
else
would
be
yeah.
You
have
to
call
get
value
with
your
custom
t
if
there's
a
custom
converter
behind
it.
That
seems
fine.
A
C
Well,
I
mean
so
is
your
intention
that
json
array,
the
indexer
that
it
exposes,
is
it
returning
json
node
or
is
it
returning
object
because
the
base
class
has
adjacent
node
one?
So
you
have
to
decide
if
you're
implicit,
if
you're,
using
new
and
implicit
binding
for
the
interface
or,
if
you're,
doing
explicit
and
letting
the
json
node
dis,
lift
up
for
which,
which
line
so
the
my
custom
data
type
v1
equal
cast
of
jra1
sub
value
is?
Is
the
indexer
exposed
off
of
json
array
without
going
through?
I
list?
A
Right,
I
believe
that
this
will
call
the
indexer
on
well.
Let
me
see
adjacent
value.
C
Because
because
I
list
of
objects,
says
you
have
to
have
an
indexer
that
returns
object
and
json
node
says
you
have
an
indexer
that
returns
json
node,
so
only
one
of
those
two
can
be
the
in
the
public
indexer.
If
your
concrete
type
is
json
array-
and
I
can't
tell
which
one
you
intended
it
to
be.
B
I
mean,
I
would
generally
say
like
it,
needs
to
be
the
one
from
the
base,
because
otherwise
this
guy
is
only
useful
for
one
hop
right.
If
you
want
to
do
json
array
of
one
and
then
oh,
that's
an
object
now,
and
I
want
to
access
the
first
name
property.
You
would
expect
us
to
to
write
j
array
of
one
and
then
of
first.
C
A
C
A
A
And
then,
if
you
want
a
possible
conversion,
you
call
get
value
on
it
of
t.
B
Yeah,
I
guess
I
think
this
is
the
thing
that
confuses
me.
It's
like
it's!
It's
a
bit
weird
to
me
and
I
haven't
really
thought
about
this
in
great
detail.
So,
like
I'm
not
saying
the
api
is
problematic.
I
just
I
just
haven't
done
it
in
my
head
that
when
you
look
at
a
dom
that
you
know
there
is
a
there's,
a
vague
property
that
is
basically
unbounded
and
the
customer
can
put
whatever
they
want
into
it.
But
I
guess
that's
the
behavior
you
have
right.
B
A
Of
this
again
is
influence
by
the
dynamic
support
where
the
the
value
is
determinant.
Basically
at
runtime,
not
necessarily
known
to
compile
time.
A
I
mean,
for
example,
you
can
have
a
custom
convergence
registered
dynamically,
which
may
may
cause
issues
even
with
non-dynamic
support.
If
you
mix
and
match
you
know
the
t
value
with
the
incorrect
custom
converters
or
with
incorrect
json
or
you
know,
the
internal
value.
E
B
B
Yeah
again
like
to
me
like
what
I
would
intuitively
understand
with
the
domus,
I
would
say
it
seems
fine
to
have
conversions,
but
I
would
say
to
me
they
only
make
sense
for
the
primitives
like
basically
or
like
you
know,
intrinsic
understood
types.
I
mean
that
don't
have
to
be
primitives
in
the
json
sense
but
like
I
think
it
makes
sense
to
say
you
can
pass
this
json
string
as
a
date
time
because
we
happen
to
understand
day
times
or
booleans
or
guides,
or
some
other
type
that
we
think
are
common
enough.
B
A
I
I
do
I
I
hear
what
you're
saying
again,
I
it
all
comes
back
to
again.
The
dynamic
support
is
like
that
right
and
you
definitely
might
want
to
have
a
custom
data
type
work
with
dynamic
without
going
through
extra.
You
know
I.
B
Mean
by
dynamic
right
I
mean,
I
would
think
to
me.
The
dynamic
support
would
be
based
off
of
the
schema
so
like.
I
would
generally
expect
when,
when
I,
when
I
do
dynamic
like
I
can,
I
can
access
the
thing
as
it
is
in
the
in
the
you
know,
in
the
structure
of
the
json
document,
so
I
can
say
dot,
first
name
dot,
last
name
or
whatever
the
property
names
in
the
underlying
json
are
right.
B
I
would
not
expect
to
say
you
know,
dot
whatever,
and
then
the
property
names
now
become,
whatever
my
properties
are
in
the
corresponding.
You
know
schema
that
I
happen
to
have
in
terms
of
custom
objects
right.
A
Well,
it's
it's
trying
to
equalize
the
playing
field
for
intrinsic
types
and
custom
data
types
in
in
this
design
right
instead
of
hard
coding,
only
types
that
we
know
about
is
saying
you
know
we
have
this
options
class.
It
knows
about
all
your
custom
data
types.
You
don't
have
to
know.
Okay,
you
might
not
even
know
what
the
custom,
if
you
have
a
custom
converter,
I
mean,
if
you
have
a
custom
converter
for
time,
span.
A
Which
you
know
stored
as
a
string,
saying
jason
with
with
the
proposal
here
forget
about
the
none
dynamic
for
a
minute,
but
with
dynamic.
You
know
you
just
go
time
span.
You
know
time
equals
whatever
the
value
and
it'll
just
work,
and
if
you
didn't
have
that
you
would
have
to
know.
Okay
time
span
is
not
supported
internally.
A
I
need
to
now
call
a
different
method.
You
know
maybe
maybe
some
sort
of
deserialized
method
or
helper
method,
I'm
not
sure,
but
then
the
intent
was
to
equal
the
playing
field
between
custom
data
types
and
internal
types,
and
also
we
have
a
bunch
of
internal
custom
converters
on
the
serializers
that
we
continuously
add,
for
example,
that
and
that
do
not
work
in
json
document
and
json
element,
because
json
document
json
element
don't
understand.
Custom
converters
are
the
serializer
in
general
right.
A
So
there's
a
ton
of
types,
including
custom,
collection
types
and
even
things
like
you
know,
enums
that
just
won't
work.
A
Yeah
yeah
I
mean
this
was
intended
for
discussion.
You
know
this
meeting
before
we
create
you
know.
The
official
api
we
might
have
to
have
another
on
discussion
definitely
need
to
clean
this
up
and
to
reflect
the
existing
prototype
and
some
feedback
here,
but
this
is
the
first
wave.
So
it's
good
good
to
have
these
discussions.
B
Yeah
you
just
go
to
gut
feel
right.
So,
like
I
spent
you
know
the
last
hour
thinking
about
this
for
the
first
time
right,
so
don't
read
too
much
into
what
I'm
saying.
I'm
just
saying
my
gut
feel
reaction
is
x
and
that
might
be
as
wrong
as
they
come
right.
So
yeah
should
we
go
further
or
is
that
enough.
A
This
section
is
not
important:
it's
just
some
some
ways
to
simplify
the
api
with
the
with
the
options.
So
yes
keep
scrolling
here,
let's
just
kind
of
get
to
the
end,
and
I
think
we
can
skip
that
we're
talking
about
indexers
here,
yeah.
Here's
an
example
of.
A
Without
that
the
example
below
is
what
we
had
previously
in
the
previous
iteration,
something
like
something
like
the
below.
You
know
it's
like.
Okay,.
A
Yeah,
so
this
was
this
feedback
here
was
from
the
azure
team
that
you
know
they
wanted
a
small
turf
syntax
which
they
have
in
their
prototype.
F
B
B
A
Let's
go
a
little
bit
more,
getting
close
to
the
end
here,
just
kind
of
cover
everything
really
quick
here
yeah.
This
is
just
saying:
hey.
If
you
want
to
change
the,
if
you
don't
want
to
use
json
element,
json
node
will
provide
a
way
for
you
to
use
this
writable
dom
these
variable
dom
types
instead
of
system
instead
of
json
element.
B
A
A
The
overflow
bucket
we
have
for
extra
properties
that
don't
map
to
any
clr.
We
put
those
in
a
dictionary
and
that's
shown
below
here.
You
know,
string,
comma
json,
element
or
string,
comma
object,
dictionary
and
now
you'd
be
able
to
specify
string,
json,
node
or
or
just
have
object,
be
json
node
instead
of
json
element.
B
A
It
could
perhaps
break
some
code
if
you
didn't
have
this
option.
B
B
A
A
Because
it
is,
this
is
a
common
scenario.
I
don't
think
it's
covered
here,
but
it's
just
an
area
where
you
have
these
this
overflow
dictionary,
which
is
kind
of
cool.
You
know
that
we
create
this
dictionary
if
you're
missing
properties.
However,
that's
kind
of
immutable
in
order
to
change
a
bill,
you
have
to
remove
an
item
from
the
dictionary
yeah
and
then
add
it
again
or
overwrite.
A
The
value
of
that
particular
dictionary
element-
and
that's
just
not
very,
I
guess,
intuitive,
so
it
would
really
help
with
mutable
dom
for
overflow
properties
or,
basically,
if
you
just
want
to
change
the
the
value
of
a
of
a
typing
return
from
system
object,
you
can't
do
that
today
right
because
you
get
your
element
back
and
it's
like.
How
do
you
change
it?
You
can't
you
have
to
create
another
one,
and
how
do
you
create
another
one?
Well,
it's
complicated.
You
have
to
have
jason
and
and
parse
it.
B
A
This
is
saying
that
we're
returning
null
instead
of
some
other
missing
property,
like
jason
element-
actually,
I
believe,
has
on
missing.
How
does
that
work.
A
Yeah
jeremy,
are
you
there?
What
what
is
what
is
jason
element?
Does
it
have
support
for
missing?
I
I!
No.
If
you
ask
for
a
property,
that's
not
there.
I
think
it'll
throw,
I
believe,
my
recollection
yeah
yeah
yeah.
So
if
you
want
to
differentiate
between
missing
and
null,
there
are
ways
to
do
that
and
that's
what
this
example
here
with
try
get
value
is
doing.
A
A
Dynamic
by
default
should
have
null
semantics,
so
this
kind
of
aligns
with
that.
We
did
get
some
feedback
on
this
early
on
that
it
is
expected
to
return
null
instead
of
throw
because
the
the
type
xmando
object
throws.
A
If
you
access
a
property,
that's
not
there,
which
is
kind
of
counter-intuitive,
because
jason
you
may
or
may
not
know,
because
jason
might
not
just
include
it
if
it's
not
there.
So
a
lot
of
people
do
not
like
expandable
object
when
it
comes
to
processing
json.
Because
of
that
semantics,
and
today
it's
not
possible
to
change.
C
A
B
You
also
have
some
json
dynamic
object
and
dynamic,
json
object,
kind
of
thing:
okay,
big
one
yeah,
makes
sense,
and
then
this
adjusts
the
converters
directly
right
or
the
conversions.
A
I
want
to
construct
my
own
type
and
I,
in
order
to
do
that,
I
might
need
to
call
it
constructor
and
to
call
a
constructor.
I
need
one
of
the
adjacent
values,
so
this
is
just
say:
hey
I
mean
it's
not
going
to
be
the
most
performant
thing
in
the
world,
but
it
says
deserialize
it
as
dynamic
as
a
temporary
value
and
then
new
up
the
real
pocos.
You
know
the
strongly
typed
version
using
the
state
from
that.
A
A
Okay,
I
I,
I
think,
there's
just
a
couple
things
at
the
bottom
but,
like
I
said
all
all
of
the.
A
Examples
that
I
have
in
the
tests
in
this
private
branch-
you
know
work
and-
and
there
might
be
some
mismatches
here
from
the
document,
but
I
would
kind
of
use
the
tests
as
some
examples
and
I'll
make
sure
that
you
know
this
is
updated
to
reflect
the
current
support
you
you
have
notes
so
emu
so
I'll.
Add
those
notes
to
here.
G
B
B
A
Has
no
ideas-
and
you
know
I
pull
the
branch
and
play
around
with
the
code-
I
you
know
I'd
recommend
it
to
get
a
feel
for
the
the
current
proposal
here.
There
are
some
questions
you
know
with
the
api
in
general,
but
I
I
do
think
that
this
design
meets
the
requirements
for
the
azure
team,
which
I
didn't
originally
have.
That's
you
know
to
be
able
to
navigate
quickly
down
without
using
the
dynamic
support,
so.
A
Given
that
you
know
the
the,
I
think,
the
high
level
programming
model
you
know
has
to
have
a
node
class,
and
then
you
know
a
collection
of
you
know
pretty
much.
What
I
have
on
here
with
some
indexers
at
the
top
newtonsoft
has
the
same.
A
So
I
think
at
the
heights
level,
the
api
for
navigation
is
correct.
I
know
there's
lots
of
issues
around
get
value
and
and
then
the
value
property
that
returns
internal
value.
So
I
think
I'll
spend
some
time
documenting
that
and
you
know
make
sure
that
we
can
discuss
it
next
time.
B
Sounds
good
all
right,
then.
I
think
let's
use
the
remaining
35
minutes
to
go
over
some
more
issues
then,
so
I
will.
I
will
respond
with
notes
to
the
pr
of
what
I
just
said,
but
I
will
do
it
after
this
meeting,
because
I
still
have
to
write
them
because
I
was
just
too
busy
listening
to
you,
I'm
not
actually
typing
anything.
B
All
right
is
eric
on
the
call
by
any
chance.
H
Okay,
we
did
talk
a
bit
about
this
issue
in
the
previous
meeting,
should
I
just
take
it
from
the
top.
B
H
H
Obviously,
this
won't
be
very
performant
because
supporting
this
for
arbitrary
indices
and
ranges
typically
means
that
you
might
want
to
consume
on
space.
But
that
being
said,
it
should
provide
the
sort
of
convenience
methods
for
certain
applications,
like
testing,
etc.
G
H
J
J
G
H
Yeah,
I
think
I
guess
I
guess
the
the
answer
that
I
have
here
is
that
element
that
the
existing
element-
that
overload
isn't
very
performant
in
the
first
place,
because
you
have
to
iterate
through
like
k
elements.
So
you
know
this
overload
is
worse
in
certain
cases,
but
it
still
sort
of
seems
to
be
acceptable
for
what
this
particular
method
is
doing
already.
If
that
makes
sense,.
B
Yeah,
I
mean
I
mean,
to
be
honest,
like
to
me
element,
add
or
similar
apis
on
link
they're
really
not
meant
for
performance
right.
I
think
they're
very
useful
when
you
you
know
in
the
debugger
or
when
you're
like
in
a
in
a
workbook
or
something
you
want
to
just
like.
You
know
quickly,
look
at
the
thing
without
like
doing
some.
B
You
know
weird
things,
because
it's
hard
to
write
code
in
the
debugger
in
that
sense
right,
but
you
know
if,
if
you
do
index
based
arithmetic
overnight
on
your
mobile,
like
you're,
in
deep
trouble
right,
so
you
would
normally
like
rewrite
your
algorithm
in
such
a
way.
You
don't
need
that,
but
I
don't
know
to
me.
The
link
apis
are
just
great
for
exploration
of
like
things
you
happen
to
have
in
memory
right,
and
if
you
have
a
billion
elements
in
memory,
then
yeah.
I
think
you
already
paid
the
penalty
for
that
right.
A
E
E
So
you
know
what
I
mean
I'd
rather
than
deal
with
it
as
an
enumerable.
I
just
say:
hey.
I
got
a
bunch
of
crap
that
you
know
just
do
dot
to
array
and
then
deal
with
it
as
a
as
an
array
which
is
much
easier
to
fuel.
C
I
mean
that's
true
of
almost
anything
that
you
do
two
link
innumerable
opera
or
two
link
operations
on
right.
It's
you
want
to
know
that
it's
in
a
good,
concrete
type
and
that
link
members
are
good
for
prototyping
and
for
you
did
a
thing
at
most
once.
H
H
H
B
J
Through
the
loop
yeah,
the
the
closest
thing
we
have
today,
if
you
want
the
last
five
elements
and
steve
toe
pointed
this
out,
the
other
day
is,
you
can
call
take
last
five,
but
it's
not
guaranteed
to
actually
give
you
five
elements.
It
will
give
you
up
to
five
elements,
so
it
does
have
slightly
different
semantics
than
what
we're
discussing.
J
Yeah,
so
so
last
we'll
give
you
the
actual
last
element.
Unless
the
enumerable
is
empty,
in
which
case
it
will
throw
right.
Take
last
says
it's
basically
take,
but
in
reverse
effectively.
So
it
says,
give
me
as
give
me
as
many
elements
from
the
end
of
the
enumeration,
as
you
can
up
to
some
maximum
number
and
the
result
could
be
an
empty
enumeration
if
the
input
was
also
empty.
B
J
So
to
the
last
api
will
give
you
only
the
last
element
as
a
standalone
value.
If
the
underlying
enumeration
is
empty,
it
will
throw
an
exception.
Take
last
gives
you
up
to
the
whatever
account
you
specify,
and
if
you
specify
one
billion,
then
it
will
buffer
a
billion
elements.
E
B
Yeah,
I
think
the
only
benefit
to
support
element
add
is
that
basically
people
can
just
have
a
single
data
type
that
has
happen
step
language
support
right,
the
implementation
would
be
trivial
right.
You
would
just
say
if
from
end
then
call
take
last
right
and
then
just
check
that
the
result
is,
you
know,
actually
the
you
know
these
elements
and
if
not
you
throw
and
say
sorry,
there
are
not
enough
elements
right.
C
Yeah
take
looks
like
take
last.
Iterator
is
just
q
of
t
yeah,
when
it's
too
full
it
does
dq
and
q
dq
and
q
to
maintain
the
right
length.
G
G
H
J
B
J
H
B
G
H
C
C
B
C
B
C
C
B
A
B
C
The
degenerate
case
would
be
that
somebody
is
naively
writing
reverse
and
they
have
a
an
incrementing
loop
or
to
do
negative
indexes
until
this
method
throws
yeah
that
took
n
squared
time
and
space,
but
good
job
call.reverse.
B
It's
you
could.
C
In
the
implementation
in
my
head,
you
would
do
something
like
take
less
like
where
you
just
use
a
cue.
You
would
never
have
let
it
exceed
whatever
the
passed
in
index
value
is
so
you
once
you
hit
the.
If
you
asked
for
care
at
five
once
you
hit
five
you're
doing
dq,
dropping
it
to
four
in
queue
to
get
the
most
recent
one
and
then
now
you
do.
The
weird
q
lets
me
peek
at
the
elements
under
the
covers
and
go
take.
Actually
at
that
point
it
would
just
be
return
q.dq.
J
H
Yeah,
I
guess
the
only
issue
is
if
the
index
is
carrot
of
a
value,
that's
passed
as
an
argument
into
a
service.
J
B
Yeah
I
mean
there's
worse
things
you
can
do
right.
Acceptor
rejects
as
an
argument.
I
mean
there's
many
ways
we
can
allow
you
to
dos
your
own
service.
How
many
gcs
do
you
want
to
run
on
the
service
right,
like
the
their
creative
ways,.
H
So
there
were
a
few
other
methods
proposed
in
this
issue,
but
we
kind
of
decided
to
ask
those
because
of
issues-
and
just
you
know,
focus
on
these
two,
because
they
are
relatively
unambiguous
in
terms
of
how
they
should
be
implemented.
But
I
definitely
think
there's
opportunity
to
expand
in
the
future.
H
H
H
B
C
C
So,
in
a
the
range
based
indexer
on
an
array
returns
an
array,
it
doesn't
return
a
slice
the.
So
if
you
pass
in
levi's
custom
collection
of
t
this,
should
this
slice
method
should
give
back
levi's
an
instance
of
levi's
custom
collection
of
t-
that's
not
guaranteed
possible,
which
means
we
can't
add
this.
We
would
need
to
call
it
something
other
than
slice
and
not
support
the
range-based
indexers.
F
F
C
What
we've
done
for
all
of
our
other
apis,
because
we
didn't
write
it
ever
thinking
anyone
would
ever
try
and
do
it
with
an
extension
method,
but
but
taking
what
we
meant
with
the
thing
of
matches.
The
input
type.
B
I
mean
I,
I
hear
what
you're
saying
jeremy.
At
the
same
time,
though,
I
would
argue
that
that
this
is
kind
of
how
all
the
link
methods
work
for
better
overs
right
I
mean
we
had
the
same
discussion
on
string
where
certain
apis
appear
on
string
and
they
are
confusing.
I
forgot
which
one
it
is.
There
was
one
that
always
happens.
I
think
it's
one
of
the
contains
overloads
that
didn't
exist
on
string
and
they
go
through
the
link
and
like
that's
I
mean
it's
unfortunate.
B
I
don't
think
that's
terrible,
because
I
mean
it's
not
that
we
don't
have
another
option
because
realistically
I
think
this
method
is
super
useful
and
I
enumerable,
and
it
seems
weird
to
block
that
because
realistically,
if
your
type
actually
supports
slicing,
you
can
just
add
a
static
method
on
your
type
that
that
does
whatever
you
want
it
to
do
right.
So
if
you
don't,
then
you
don't
and
then
you
get
the
you
know,
shitty
link
implementation
and
if
you
do
have
a
better,
you
know
api
for
that.
B
Well
then,
it
hides
the
link
implementation,
so
this
doesn't
really
prevent
you
from
supporting
slicing
in
a
sensible
way.
It's
just
you
have
a
fallback
mechanism
to
say
anything
design
removable.
You
know,
there's
a
default
slice
implementation
that
might
not
be
great
but
like
it's
probably
decent
enough
for
unless
you
care
right.
C
The
only
way
we
could
find,
if
you
have
other
slice
implementations,
is
to
to
do
reflection
like
this
can't
there's
nothing
optimal.
It
could
do
aside
from
special
casing
specifically
list
of
t
in
array.
No.
B
It
would
be
statically
right,
like
you
would
say,
like
you
know,
string
support,
slicing
right.
So
the
fact
that
I
knew
mobile
that
the
string
is
in
your
mobile
of
char,
it
just
means
the
the
implementation
that
we
have
on
string
hides
this
one
right,
that's
realistically
what
happens
right
so,
like
you
have
a
compile
time
polymorphism,
if
you
will
right
like.
C
At
one
time
I
would
using
the
okay,
but,
but
if
they
yes,
if
they
had
the
thing
non-statically
typed
as
the
input
type,
because
they
already
had
it
as
another,
I
enumerable,
then
there
is
going
to
be
a
change
of
the
shape
of
data.
And,
yes,
that
happens
with
all
the
link
things,
but
it
does
mean
that
this
this
method
does
give
up
on
performance.
C
Characteristics
like
I
feel,
like
some
of
the
link
methods
are
if
a
countable
thing
went
in
a
countable
thing
comes
back
out
and
it
can
to
make
further
queries
fast
right,
but
in
this
one
it's
this
this
loses
all
notion
of
countability.
This
is,
if
you
hit
this,
it's
garbage.
B
Yeah
to
be
clear,
like
I'm,
not
saying
necessarily
like
you
know
like
if
we
feel
strongly
about
the
semantics
of
a
method
called
slice,
I
would
just
name
it
differently.
I
mean
I
think
it
was
reasonable
to
just
take
this
sorry.
We
name
this
api
to
take,
because
that's
probably
more
in
the
spirit
of.
C
H
For
what
it's
worth,
there
has
been
an
alternative
name
proposed
in
in
the
issue.
So
you
know,
if
you
scroll
down
a
bit
you'll
see
that
one
alternative
name
was
called
elements
in.
C
Yeah,
like
the
to
me,
it
feels
like
the
notion
of
letting
this
happen
as
I
fall
back
on.
All
enumerable
types
means
that
we
have
completely
lost
the
goal
that
we
had
with
the
square
bracket
with
range,
like
you
know
what
it
means
and
it
if
you
have
an
expensive
type
like
an
array,
it's
an
expensive
operation
and
if
you
have
a
cheap
type
like
spam,
it's
a
cheap
operation,
absolutely
and.
B
B
Yeah,
so
if
there
is
an
extension
method,
called
slice,
does
the
compile
allow
it
to
use
the
bracket
syntax?
Even
if
it's
on
an
interface,
I
don't
think
it
does
right.
So,
like
I
guess,
my
question
is:
if
we
rename
this
they'll
be
losing
any
syntactic
sugar,
I
don't
think
so.
I
don't
think
you
get
to
use
brackets
on
immobile
with
that
extension
method,
anyways.
C
If
it
won't
find
it
on
extension
methods,
then
we
could
call
it
this,
except
if
they
add
it
in
the
future,
then
we've
lost.
So
I
think
that
we
want
a
name.
That's
not
sliced,
I'm
not
I'm
not
objecting
to
the
the
concept
I'm
objecting
to
using
the
word
slice.
B
C
I
mean
we
can
even
use
the
we
can
even
just
call
it
that
range.
That
takes
a
range
like
that.
C
C
G
C
I
mean
this
one
would
be
weird
because
if
you,
if
you
call
this
method
with
five
dot
dot,
caret
27
like
we
now
have
to
count
to
figure
out
that
carrot,
27
was
below
5,
which
is
negative,
negative
slicing,
and
then
that
would
have
to
throw
like
so
there
there's.
Definitely
once
ranges
involved.
The
notion
that
I'm
sorry
you're
in
your
your
combination
of
beginning
and
end
made
no
sense
for
your
data.
So
I
don't
think
that
saying
that
this
take
can't
return
less
than
the
x
fully
expressed
range
on.
That
is
bad.
C
If
you
call
array.slice
with
where
the
end
argument
ends
up
being
before
the
start
argument,
that'll
throw.
E
J
C
G
G
C
Well,
because
skip
would
skip
the
whole
thing
right:
you'd
get
back
the
assuming
that
it
doesn't
throw,
you
would
get
back
the
empty
enumerable
and
then
you
would
call
take,
and
that
would
give
you
back
the
empty
enumerable.
Sorry
take
last,
so
you
would,
you
would
get
back
nothing
yeah.
So
I
don't.
H
C
Right
well
again,
that's
that-
and
that
comes
back
to
the
weirdness
with
using
the
word
slice,
because
that
is
not
what
slice
means
anywhere
else.
B
Yeah
I
mean,
I
think
it's
like,
let's
start
differently.
What
should
we
want
for
this
right?
If
we,
if
we
want
the
symmetries
that
take,
has,
then
I
think
calling
a
take
or
some
version
of
take
right,
take
or
take
range
makes
sense
right.
If
you
want
the
semantics
that
slice
has,
which
is
kind
of
you
know,
you
need
to
be
at
least
those
numbers
of
elements
or
we
throw
then
arguably
take
is
a
bad
name
right.
B
But
if
I'm,
if
I
actually
want
to
get
back
effectively
something
that
has
the
right
size,
then
well,
then
I
totally
care
when
I'm
off
by
one-
and
I
don't
want
to
now
have
an
array
that
is
like
for
for
short
or
something
right,
and
so
I
guess
it
kind
of
boils
down
to
what
what
you
want
from
this
method.
I
Why
don't
we
have
these
take
methods
on
array
and
string
right
like
we
did
all
this
work
for
index
and
range
for
array
and
string,
and
we
had
the
slice
semantics
right
because
that's
important
because
that's
what
people
want,
I
would
assume
the
exact
same
reasoning
applies
here.
It's
just.
I
don't
have
a
string
or
an
array.
I
just
have
an
I
innumerable.
So
why
wouldn't
I
want
those
semantics.
B
Yeah,
I
think
it
kind
of
depends
on
how
you
view
the
original
right,
because
if
you,
if
you
talk
about
a
string
or
on
array
like
they
are
fixed
size
right,
you
know
exactly
how
many
elements
are
in
there
right
versus
nine
numerable
is
a
sequence,
so
I
think
the
because
of
that
mindset.
I
think
you
very
often
want
to
not
have
exact
semantics,
but
you
want
the
wall,
take
up
two
and
then
see
how
far
we
get
or
you
know
skip
up
to,
and
then
we
see
how
far
we
get
right.
B
H
H
Given
that
enumerable
is
lazy,
it
also
means
that
you
know
you
might
evaluate
this.
You
know
at
a
later
stage
when
the
size
is
different
or
you
may
might
might
evaluate
it
multiple
times,
and
I
should
also
add
I
personally
sort
of
lean
towards
adopting
take
semantics,
primarily
because
there
is
nothing
unsound
about
returning,
an
empty
enumerable
or
an
enumerable
that
has
fewer
elements
than
what
is
specified
in
the
range
argument,
because
it's
basically
like
said
theoretic
semantics,
so
you
know
you
could
just
adopt
that
approach
without
any
real
issues.
H
In
my
opinion,
the
only
issue,
of
course,
is
consistency
with
the
slice
implementations
in
the
other
concrete
types,
but
if
we
name
it
something
different
that
shouldn't
be
a
problem.
I
B
B
Sorry,
like
no
I'm
saying
like
the
existing
skip
and
take
methods,
I've
often
used
them
in
combination.
I
started
with
skip
and
then
take,
and
so
to
me,
this
take
range.
Would
just
allow
me
to
do
this
in
one
line
rather
than
two
lines
right.
So
that's
why
I'm
leaning
towards
the
take
semantics,
but
that's
my
opinion
on
how
I
would
use
the
api
right.
I
don't
know
what
the
original
issue
opener
had
in
mind
for
this.
J
B
Originally
open
I
mean,
I
guess
it
depends
how
you
read
it
like
the
way
I
read
it
is
basically
people
want
the
syntactic
sugar
that
index
and
range
operators
give
you
and
want
this
to
be
applied
for
a
new
mobile
right.
I
don't
think
necessarily
that
you
know.
I
don't
think
that
means
what
you
what
you
said,
or
that
means
what
I
want
right
like
it
just.
I
think
it's
kind
of
ill-defined,
if
you
will.
C
C
B
Like
I,
I
don't
have
a
strong
opinion,
I'm
just
saying,
based
on
my
own
usage
of
innumerable
and
what
I
would
expect
the
api
to
do.
I
would
personally
expect
take
semantics,
but
like
that
doesn't
mean
that
that's
the
only
way
to
do
it
and
all
I'm
saying
is.
I
think
we
should
be
clear
on
what
the
semantics
are,
that
this
thing
would
do
and
then
pick
a
name
accordingly
and
it's
conceivable
that
we
end
up
with
both
take
and
slice
because
well
depends
on
what
you
want
right.
B
H
Agreed,
I
should
also
say
that
you
know
the
index
and
range
types,
don't
have
any
semantics
hard
baked
into
them
and
I
think
it.
It
is
wise
that
we
use
completely
different
names
for
the
index
and
range
methods
precisely
to
highlight
the
fact
that
I
enumerable
is
something
completely
different
to
the
I
list.
Like
types
so
yeah,
I
I
would,
I
would
think
like
calling
the
range
method
take
is
good
idea
and,
following
the
same
semantics,.
G
H
B
Yeah,
although,
like
again
like
the
way,
I
would
use
this
apis,
it
probably
wouldn't
matter
like
the
99
percent
case
for
me-
would
be
a
pass
in
collections
that
have
less
than
10
elements
or
something
right
so
where,
even
if
you
do
it
a
super
naive
way
like
it
would
be
still
fast
enough
to
me
the
argument
for
supporting
it,
I
think,
is
more
to
do
with
touristness
in
the
usual
sp.
You
know
you.
B
And
and
in
other
places
where,
if
space
is
limited,
you
just
want
quick
answers
right,
I
and
I
think
I
guess
general
orthogonality
with
language
features.
You
mean
something
fundamental
as
dot
dot
or
a
carrot.
You
probably
would
expect
that
to
have
wide
support,
so
I
think
that's.
These
are
the
only
the
only
reason.
I
don't
think
this
api
would
do
anything
that
you
couldn't
already
do
right.
B
So
yeah
yeah,
I
mean
my
other
question
is
is
like
you
know,
there's
other
overloads
where
that
would
make
sense,
and
maybe
you
have
two
array,
for
example.
It
doesn't
strike
me
as
insane
to
say
two
array
has
an
overload.
That
also
takes
a
range
right
and
then
this
would
have
the
normal
slice
semantics,
but
you
would
say:
well
you
better,
have
these
elements
in
it,
because
you
would
expect
an
array
to
get
that
size
right.
G
C
Right,
I
just
like
it.
I
think
that
that
the
I
can
see
the
value
in
such
an
overload,
but
I
think
that
it
becomes
confusing
and
that
and
if
you
want
the
hard
bounded
one
yourself,
you
know
that
could
easily
be
written.
J
Yeah
some
someone
in
chat
just
brought
up
something.
That's
been
bugging
me
for
a
few
minutes,
which
is
the
I
queryable
implementations
are
going
to
be
insanely
complicated,
because
if,
if
the
index
or
range
that
you
pass
in
consists
of
only
read
from
the
front
values
2.3
whatever
those
are
really
easy
to
do,
because
you
can
literally
rewrite
them
in
terms
of
skip
and
take
if
we
start
doing
from
the
end,
things
get
very
complicated
very
quickly
and
these
apis
actually
cannot
be
written
in
terms
of
existing
apis.
J
No
so
so
say
that
you
do
say
that
you
do
one
dot,
dot
carrot,
one
right.
You
want
to
skip
the
very
first
element
and
stick
the
very
last
element
you
can't
chain
the
final
skip
on
top
of
the
first
step,
because
the
count's
going
to
be
wrong.
B
J
C
Right,
but
that
would,
if
you
had
one
dot
dot
carrot,
one
that
would
be
queryable
dot
skip
one
dot
skip
last
one
and
we
have
enumerable.skiplast.
I
C
A
C
Carrot
number
is
skip
last.
We
were
calling
it
take
class,
but
it's
really
skip
last.
C
So
the
this
this
take
method
is
yeah
return,
skip
on
a
from
index
or
skip
last
on
a
on
a
back
index.
So
if
you
did
carrot,
17.
care
at
5
that
would
be
return.
Skip
last
17
dot
well
skip
last
16
dot
skip
last
zero.
One.
J
C
C
Be
skip
skip
less
to,
and
I
guess
you'd
need
to
have,
looked
and
realized
that
the
indexes
are
going
to
have
gone
wrong,
and
then
you
turn
that
into
whatever
we
said
it
would
do
for
you've
gone
too
far.
It
looks
like
enumerable.skip.
If
you
give
it
a
negative
number,
it
just
turns
it
into
zero
and
moves
on.
C
So
if
it's,
if
it's
from
beginning
and
from
or
from
end
and
from
end,
we
would
need
to
do
the
math
before
deferring
to
the
existing
things,
but
I
think
that
for
the
most
part,
this
can
just
all
be
it's
a
four-way
table
of
calling
skip
and
skip
lasts.
C
Carrots
end
up
being
skip,
lasts
and
non-carrots
end
up
being
skips,
and
you
need
to
figure
out
if
you
need
to
do
offsetting,
or
maybe
it's
positive
positive
is
skip
and
take.
But
yeah
like
everything
is
expressible.
I
think
in
terms
of
skip
skip
last,
take
and
take
last.
B
H
There
is
one
potential
downside
of
adding
element
that
in
queryable,
and
that
is
it
could
break
existing
query
providers
because
we
would
be
adding
an
overload
for
elementat
where
one
didn't
exist
before
so,
assuming
that
they
did
a
bit
of
reflection
code
that
assumed
that
hey,
there's
only
one
element
that
method
that
could
end
up
breaking
the
query
providers.
So
the
question
is
what
is
the
precedent
when
adding
methods
in
link
here,
because
I'm
not
familiar
with
what
we've
been
doing
in
the
past
in
similar
situations.
C
B
B
That's
fair,
but
I
think
our
general
breaking
bar
policy
for
that
is
yeah.
That's
a
potentially
a
breaking
change,
but
one
we
consider
acceptable
because
otherwise
we
can't
evolve
our
api
service.
Like
we
generally
don't
say
you
can't
go
from
zero
overloads
to
more
than
one
overload
right.
Like
that's,
not
a
rule.
We
follow
and
I
would
think
most
query
providers
if
they
want
to
do
something
sensible
like
they.
It's
not
that
they
can
just
blindly
reflect
over
the
time
either
right.
B
B
C
Yeah,
the
only
or
you
know
when
I
wrote
down,
wrote
the
breaking
changes
section
and
was
looking
at
our
precedent
that
yeah
we
adding
the
first
overload
can
break
reflection,
we're
generally
okay
with
it,
but
that
there
then
becomes
some
weirdness
if
null
was
allowed
to
be
passed
in
or
well
default,
but
because
generally,
that
would
be
if
we
were
simplifying
a
signature.
B
B
B
I
don't
remember
ever
having
had
a
conversation
about
overloads,
so
we
should
check,
but
I'm
pretty
sure
we
already
have
done
that
and
I
think
we
consider
that
acceptable,
but
it
wouldn't
be
hard
to
check
just
see
what
the
difference
is
between
that
zedon
and
framework
and
dotnet
course
link
and
links
variable
and
see
what
the
what
the
discrepancy
is.
C
H
C
H
Mark
it
as
needs
more
work
and
I'll
come
back
once
we've
ironed
out
like
a
final
proposal
for
slice,
including
semantics.
B
A
A
H
B
All
right,
so
let
me
just
paste
this
in
here
and
then
are
folks.
Okay
with
what
I've
written
here.
C
Oh,
and
one
more
note
to
take
while
taking
notes,
is,
does
parallel,
enumerable
need
any
of
these.
It
looks
like
we
have
parallel
enumerable
element
at
so.
C
H
B
J
B
C
B
B
C
B
That,
yes,
I
think
that
it's
generally
a
true
statement.
I
mean
the
nice
thing
is
now
that
it
if
the
type
is
already
annotated,
I
think
you
will
get
probably
warnings
if
you
actually
add
meaningful
test
coverage
for
those,
so
we
will
probably
find
it
so
all
right.
So
I
added
a
node
on
p
link.
I
did
a
node
on
deck
variable,
breaking
change
with
link
provider
thing,
and
so
let
me
comment
this
now
and
then,
let's
just
mark
it
as
api
needs
to
work
and
call
it
a
day.
B
A
H
C
H
C
If
we
want
hard
slicing,
we
need
to
understand
what
other
things
in
a
numerable
look
like
that,
and
I'm
still
going
to
be
wary
of
using
the
word
slice,
because
if
even
if
the
language
doesn't
support
picking
it
up
off
of
extension
methods
now,
if
they
did
in
the
future,
then
we'd
have
a
very
long
argument
with
the
language
team
that
we
didn't
want
this
to
have
been
found.
So
so
I
think
we
want
to
avoid
the
word
slice,
no
matter
what,
but
in
order
to
know
what
the
best
name
for
it
is.
J
Make
sense
I
I
also
posted
into
chat
an
example
of
a
call
that
is
extremely
complicated
for
variable
semantics,
and
we
would
need
answers
to
stuff
like
that.
I
would
need
to
put
that
into
the
github
issue
as
well,
because
clearly
people
can't
see
our
team
chat.
B
Yeah,
so
to
me,
the
action
items
is
the
symbolics
of
take
it's
figuring
out
whether
we
should
address
anything
in
p-link
and
then
making
sure
that
we
are
okay
with
adding
new
members
to
curable
right
and
if
the
answer
for
that
is
no,
then
we
can
just
change
the
proposal
to
only
evolve.
Innumerable
that's
also
fine,
but
but
I
think
we
need
answers
for
all
three
of
them.