День 2252. #ЗаметкиНаПолях
Пример Сопоставления по Шаблону
Сегодня поделюсь с вами фрагментом кода от Жеральда Барре (aka Meziantou), в котором используется сопоставление по шаблону, а также метод SplitAny, использующий SearchValues<char>.
В примере ниже приведён простой сопоставитель версий, который проверяет, удовлетворяет ли версия (version) ограничениям (constraints). Ограничения — это строка, которая может содержать несколько ограничений, разделённых ,
или ;
. Каждое ограничение может быть одной версией или диапазоном версий. В свою очередь, диапазон может выглядеть как >1.0.0
, >=1.0.0
, <1.0.0
, <=1.0.0
, =1.0.0
, или 1.0.0
.
using System.Buffers;
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>
SplitChars = SearchValues.Create([',', ';']);
public static bool IsValid(
ReadOnlySpan<char> version,
ReadOnlySpan<char> constraints)
{
var parsed = Version.Parse(version);
foreach (var partRange in
constraints.SplitAny(SplitChars))
{
var part = constraints[partRange].Trim();
if (part.IsEmpty)
continue;
var satisfy = part switch
{
['=', .. var r] => parsed == Version.Parse(r),
['<', '=', .. var r] => parsed <= Version.Parse(r),
['<', .. var r] => parsed < Version.Parse(r),
['>', '=', .. var r] => parsed >= Version.Parse(r),
['>', .. var r] => parsed > Version.Parse(r),
_ => parsed == Version.Parse(part),
};
if (!satisfy)
return false;
}
return true;
}
}
Источник: https://www.meziantou.net/nice-example-of-csharp-list-pattern-matching.htm
>>Click here to continue<<