Nice example of C# list pattern matching

 
 
  • Gérald Barré

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!

Follow me:
Enjoy this blog?Buy Me A Coffee💖 Sponsor on GitHub