Non-mutating nature

None of the functions on a $linq class inherently modify the objects they contain. Each $linq function that returns a $linq object returns an entirely new $linq object. This means that a $linq object can be reused multiple times and continually represets the
same sequence of objects. For example:

Note that nothing stops any of the predicates, selectors, comparers, etc. passed to $linq functions from modifying the items within the $linq sequence. When the $linq constructor makes a copy of the array passed to it, it makes a shallow copy--that is, it does
not make copies of the objects within the array, only of the array itself. For example: