adding CS11 list patterns
This commit is contained in:
@@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
namespace CS11 {
|
||||||
|
class Program {
|
||||||
|
static void Main(string[] args) {
|
||||||
|
int[] numbers = { 1, 3, 42 };
|
||||||
|
// Exact match
|
||||||
|
Console.WriteLine($"numbers is [1,3,42]: {numbers is [1, 3, 42]}");
|
||||||
|
// Must be correct length, so this is false
|
||||||
|
Console.WriteLine($"numbers is [1,3]: {numbers is [1, 3]}");
|
||||||
|
// Can use wildcards
|
||||||
|
Console.WriteLine($"numbers is [1,3,_]: {numbers is [1, 3, _]}");
|
||||||
|
// Still must be correct length!
|
||||||
|
Console.WriteLine($"numbers is [1,3,_,_]: {numbers is [1, 3, _, _]}");
|
||||||
|
|
||||||
|
// Really don't care about length? Use ..
|
||||||
|
Console.WriteLine($"numbers is [..,42]: {numbers is [.., 42]}");
|
||||||
|
|
||||||
|
// Cool stuff, match with embedded patterns - this is true
|
||||||
|
Console.WriteLine($"numbers is [1,3,>10]: {numbers is [1, 3, > 10]}");
|
||||||
|
// ... and this is false
|
||||||
|
Console.WriteLine($"numbers is [1,3,>100]: {numbers is [1, 3, > 100]}");
|
||||||
|
|
||||||
|
|
||||||
|
// Docs at https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/patterns#list-patterns
|
||||||
|
// show an example with CSV import -- cool idea, but of course
|
||||||
|
// the CSV content is always a list of strings so advanced
|
||||||
|
// patterns can't be used for non-string content.
|
||||||
|
|
||||||
|
// What the docs don't tell you (at least I didn't see it
|
||||||
|
// anywhere -- found it in GitHub), you can split head and tail
|
||||||
|
// On second read, I found this:
|
||||||
|
// "The var pattern can capture a single element, or a range of elements."
|
||||||
|
// I imagine that somebody thought this would be sufficient.
|
||||||
|
if (numbers is [var x, .. var xs]) {
|
||||||
|
Console.WriteLine($"Head: {x}");
|
||||||
|
Console.WriteLine($"Tail: {xs}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// So we can do nice functional-style stuff:
|
||||||
|
Console.WriteLine($"Sum of numbers: {Sum(numbers)}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we're talking
|
||||||
|
static int Sum(int[] l) => l switch
|
||||||
|
{
|
||||||
|
[] => 0,
|
||||||
|
[var x, .. var xs] => x + Sum(xs)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user