Nice example of C# list pattern matching
This post is just me sharing a snippet of code where I'm glad C# has list pattern matching 🙂 You can see how concise the code is! Also, you can see the SplitAny
method introduced in .NET 9 in action with the SearchValues<char>
.
This snippet is a simple version matcher that checks if a version satisfies a constraint. The constraint is a string that can contain multiple constraints separated by ,
or ;
. Each constraint can be a single version, or a range of versions. The range can be >1.0.0
, >=1.0.0
, <1.0.0
, <=1.0.0
, =1.0.0
, or 1.0.0
.
C#
using System;
using Meziantou.Framework.Versioning;
var version = "1.5.0";
var constraints = ">=1.0.0,<2.0.0";
Console.WriteLine(VersionMatcher.IsValid(version, constraints));
class VersionMatcher
{
private static readonly SearchValues<char> SplitCharacters = SearchValues.Create([',', ';']);
public static bool IsValid(ReadOnlySpan<char> version, ReadOnlySpan<char> constraints)
{
var parsedVersion = SemanticVersion.Parse(version);
foreach (var partRange in constraints.SplitAny(SplitCharacters))
{
var part = constraints[partRange].Trim();
if (part.IsEmpty)
continue;
var satisfy = part switch
{
['=', .. var rangeVersion] => parsedVersion == SemanticVersion.Parse(rangeVersion),
['<', '=', .. var rangeVersion] => parsedVersion <= SemanticVersion.Parse(rangeVersion),
['<', .. var rangeVersion] => parsedVersion < SemanticVersion.Parse(rangeVersion),
['>', '=', .. var rangeVersion] => parsedVersion >= SemanticVersion.Parse(rangeVersion),
['>', .. var rangeVersion] => parsedVersion > SemanticVersion.Parse(rangeVersion),
_ => parsedVersion == SemanticVersion.Parse(part),
};
if (!satisfy)
return false;
}
return true;
}
}
Do you have a question or a suggestion about this post? Contact me!
Enjoy this blog?
💖 Sponsor on GitHub