allocation optimizations for immutable collections

requesting the Keys or Values of an immutable (sorted) dictionary allocates every time. In scenarios where a dictionary is setup and then used repeatedly, this is inefficient.
The naming convention you've used here doesn't conform to the rest of the file/library, nor with the published [coding guidelines](https://github.com/Microsoft/dotnet/blob/master/CONTRIBUTING.md). Until we sweep through this code to conform with the published guidelines, please adopt the pattern used in the file so it is self-consistent.