Introduction
It's a bit tricky, since on-line non-MS code examples are incomplete.
Using the Code
- Follow the directions here to install the
Roslyn_CSharp_8_Preview
:
https://github.com/dotnet/csharplang/wiki/vNext-Preview#installation-instructions - Copy the code here into your project:
https://raw.githubusercontent.com/dotnet/csharplang/master/proposals/ranges.cs - Using NPM in Visual Studio, install https://www.nuget.org/packages/System.Memory/
Step #3 will get you the Span<T>
feature needed for using the ranges.cs code.
Note: Future of Span
: Richard Landry of MS: "Span
is included in .NET Core 2.1. We explored including Span
in .NET Framework 4.8 and decided against it due to compatibility concerns for existing applications. You can get access to Span
and additional related types in the System.Memory
Nuget package which enables some of the scenarios that are enabled on .NET Core."
An Example
Note: Don't be surprised if your code gets "lit up" with the kind of red squiggles usually seen when symbols can't be resolved by the compiler, or you get (with ReSharper) "unreachable code" pop-up messages. That's the price you pay for exploring new worlds. :)
My 2-cents worth: feels weird to use 'when in what seems to me the same way we use 'where in Linq.
I also find having to repeat "var p when
,..." tedious, but, keep in mind that makes sense when each "case
" statement" is going to declare an internal variable of a different Type. See the 'Person
class example in Jonathan Allen's article here for that.
Use it like this:
Passenger p1 = new Passenger("joe", 32);
private void test()
{
var fare = p1.GetPaxAge();
}
public class Passenger
{
public Passenger(st4ing name, int age)
{
Name = name;
Age = age;
}
public string Name { get; }
public int Age { get; }
}
public enum PaxAge
{
Infant, Youth, Teen, Adult, Senior
}
public static class PaxExtension
{
public static PaxAge GetPaxAge(this Passenger pax)
{
int age = pax.Age;
return pax switch
{
var p when adult.Contains(age) => PaxAge.Adult,
var p when teen.Contains(age) => PaxAge.Teen,
var p when youth.Contains(age) => PaxAge.Youth,
var p when infant.Contains(age) => PaxAge.Infant,
_ => PaxAge.Senior
};
}
static List<int> infant = 0.GetRange(2);
static List<int> youth = 3.GetRange(12);
static List<int> teen = 13.GetRange(18);
static List<int> adult = 19.GetRange(59);
}
public static class IEnumExtensions
{
public static List<int> GetRange(this int start, int end)
{
return Enumerable.Range(start, end - start + 1).ToList();
}
}