{"id":2311,"date":"2024-07-13T11:10:38","date_gmt":"2024-07-13T09:10:38","guid":{"rendered":"https:\/\/cdiese.fr\/?p=2311"},"modified":"2025-06-14T01:58:38","modified_gmt":"2025-06-13T23:58:38","slug":"cheat-sheet-pattern-matching","status":"publish","type":"post","link":"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/","title":{"rendered":"Aide-m\u00e9moire pattern matching C#"},"content":{"rendered":"<p>Cet article est un aide-m\u00e9moire des motifs les plus courants de <i>pattern matching<\/i> suivant les versions de C# pour aider \u00e0 se rappeler de la syntaxe:<\/p>\n<table>\n<thead>\n<tr>\n<th>Motif<\/th>\n<th>Version C#<\/th>\n<th>Remarques et exemples<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><b>Null pattern<\/b><\/td>\n<td><b>C# 7.0<\/b><\/td>\n<td><b>Test pour v\u00e9rifier si une variable est nulle<\/b><\/p>\n<pre><code class=\"cs\">Vehicle vehicle = new Car();  \r\nif (vehicle is null)  \r\n  Console.WriteLine($\"{nameof(vehicle)} is null.\");  \r\nelse  \r\n  Console.WriteLine($\"{nameof(vehicle)} is not null.\");<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>Constant pattern<\/b><\/td>\n<td><b>C# 7.0<\/b><\/td>\n<td><b>Comparaison entre une variable et une constante<\/b><\/p>\n<pre><code class=\"cs\">object carAsObj = new Car();  \r\nif (carAsObj is \"45\")  \r\n  Console.WriteLine($\"{nameof(carAsObj)} is 45.\");  \r\nelse  \r\n  Console.WriteLine($\"{nameof(carAsObj)} is not 45.\");\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\"><b>Type pattern<\/b><\/td>\n<td><b>&lt; C# 7.0<\/b><\/td>\n<td><b>Test par rapport \u00e0 un type:<\/b><br \/>\nSi on consid\u00e8re les types:<\/p>\n<pre><code class=\"cs\">class Vehicle\r\n{\r\n    public string Name;\r\n}\r\n\r\nclass MotoBike : Vehicle\r\n{\r\n    public int Power =&gt; 100;\r\n}\r\n\r\nclass Car : Vehicle\r\n{\r\n    public int PassengerCount { get; set; }\r\n}\r\n<\/code><\/pre>\n<p>Avant C# 7.0, on pouvait effectuer les tests suivants:<\/p>\n<pre><code class=\"cs\">if (vehicle is Car)  \r\n  Console.WriteLine($\"{nameof(vehicle)} is a car.\");  \r\nelse if (vehicle is Motobike)  \r\n  Console.WriteLine($\"{nameof(vehicle)} is a motobike.\");  \r\nelse  \r\n  Console.WriteLine($\"{nameof(vehicle)} has not been identified.\"); \r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>C# 7.0<\/b><\/td>\n<td><b>Test par rapport \u00e0 un type et <i>cast<\/i> (utilisation implicite de <code>as<\/code>).<\/b><\/p>\n<p>Avec le motif <i>type<\/i>, \u00e0 partir de C# 7.0, on peut \u00e9crire:<\/p>\n<pre><code class=\"cs\">if (vehicle is <u>Car car<\/u>)  \r\n  Console.WriteLine($\"{nameof(vehicle)} is a car with {car.PassengerCount} passagers.\");  \r\nelse if (vehicle is <u>Motobike motoBike<\/u>)  \r\n  Console.WriteLine($\"{nameof(vehicle)} is a motobike of {motobike.Power} horsepower.\");  \r\nelse  \r\n  Console.WriteLine($\"{nameof(vehicle)} has not been identified.\");\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>Construction <code>switch...case<\/code><\/td>\n<td><b>C# 7.0<\/b><\/td>\n<td>\n<pre><code class=\"cs\">object carAsObj = new Car();  \r\nswitch (carAsObj)  \r\n{  \r\n  case null:  \/\/ Null pattern\r\n    Console.WriteLine(\"Is null\");  \r\n    break;  \r\n  case \"45\":  \/\/ Constant pattern \r\n    Console.WriteLine(\"Is a constant, not a vehicle.\");  \r\n    break;  \r\n  case Car car:  \/\/ Type pattern\r\n    Console.WriteLine($\"{nameof(carAsObj)} is a car with {car.PassengerCount} passagers.\");  \r\n    break;  \r\n  case Motobike motobike:  \/\/ Type pattern\r\n    Console.WriteLine($\"{nameof(carAsObj)} is a motobike of {motobike.Power} horsepower.\");  \r\n    break;  \r\n  default:  \r\n    Console.WriteLine($\"{nameof(carAsObj)} has not been identified.\");  \r\n    break;  \r\n} \r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>Ajouter des conditions avec <code>when<\/code> et <code>switch...case<\/code><\/td>\n<td><b>C# 7.0<\/b><\/td>\n<td colspan=\"2\">\n<pre><code class=\"cs\">Vehicle vehicle = new Car();  \r\nswitch (vehicle)  \r\n{  \r\n  case Car car <u>when<\/u> car.PassengerCount &lt; 1:  \r\n    Console.WriteLine($\"{nameof(vehicle)} is an empty car.\");  \r\n    break;  \r\n  case Car car <u>when<\/u> car.PassengerCount &gt; 3 &amp;&amp; car.PassengerCount &lt;= 5:  \r\n    Console.WriteLine($\"{nameof(vehicle)} is a fully loaded car.\");  \r\n    break;  \r\n  case Car car <u>when<\/u> car.PassengerCount &gt; 8:  \r\n    Console.WriteLine($\"{nameof(vehicle)} is a heavy loaded car.\");  \r\n    break;  \r\n  default:  \r\n    Console.WriteLine($\"{nameof(vehicle)} has not been identified.\");  \r\n    break;  \r\n}\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>var pattern<\/b><\/td>\n<td><b>C# 7.0<\/b><\/td>\n<td>Ce motif donne l&#8217;impression d&#8217;appliquer une condition avec l&#8217;op\u00e9rateur <code>is<\/code> toutefois ce n&#8217;est pas le cas, la clause est toujours vraie. L&#8217;int\u00e9r\u00eat est d&#8217;effectuer une affectation du r\u00e9sultat de l&#8217;expression dans une variable qui pourra \u00eatre utilis\u00e9e pour d&#8217;autres conditions:<br \/>\n<code><span style=\"color:#D35400\">&lt;<i><b>expression<\/b><\/i>&gt;<\/span> is var <span style=\"color:#D35400\">&lt;<i><b>nom de la variable<\/b><\/i>&gt;<\/span><\/code> est toujours vraie, le r\u00e9sultat de <code><span style=\"color:#D35400\">&lt;<i><b>expression<\/b><\/i>&gt;<\/span><\/code> est affect\u00e9 dans la variable <code><span style=\"color:#D35400\">&lt;<i><b>nom de la variable<\/b><\/i>&gt;<\/span><\/code>. <\/p>\n<p>Par exemple:<\/p>\n<pre><code class=\"cs\">List&lt;Vehicle&gt; vehicles = new List&lt;Vehicle&gt;{ new Car() }; \r\n\/\/ Toujours vrai, le r\u00e9sultat est dans bigVehicle\r\nif (<b>vehicles.FirstOrDefault(v =&gt; v.GetWheelCount() &gt; 3) is var bigVehicle<\/b>)\r\n{ \r\n  if (bigVehicle.GetWheelCount() == 4) \r\n    Console.WriteLine(\"The vehicle is a car\"); \r\n  else if (bigVehicle.GetWheelCount() == 6) \r\n    Console.WriteLine(\"The vehicle is a little truck\"); \r\n  else if (bigVehicle.GetWheelCount() &gt; 6) \r\n    Console.WriteLine(\"The vehicle is a big truck\"); \r\n}\r\n<\/code><\/pre>\n<p>Utilisation avec <code>switch...case<\/code>:<\/p>\n<pre><code class=\"cs\">switch(vehicles.FirstOrDefault(v =&gt; v.GetWheelCount() &gt; 3)) \r\n{ \r\n  case null: \r\n    Console.WriteLine(\"No big vehicle round\"); \r\n    break; \r\n  case <u>var car<\/u> when car.GetWheelCount() == 4: \r\n    Console.WriteLine(\"The vehicle is a little truck\"); \r\n    break; \r\n  case <u>var truck<\/u> when truck.GetWheelCount() == 6: \r\n    Console.WriteLine(\"The vehicle is a little truck\"); \r\n    break; \r\n  case <u>var bigTruck<\/u> when bigTruck.GetWheelCount() &gt; 6: \r\n    Console.WriteLine(\"The vehicle is a big truck\"); \r\n    break; \r\n}\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>Expression <code>switch<\/code><\/b><\/td>\n<td><b>C# 8<\/b><\/td>\n<td>Syntaxe permettant de faciliter l&#8217;affectation d&#8217;une variable suivant plusieurs conditions:<\/p>\n<pre><code class=\"cs\"><span style=\"color:#D35400\">&lt;<i><b>nouvelle variable \u00e0 assigner<\/b><\/i>&gt;<\/span> = <span style=\"color:#D35400\">&lt;<i><b>variable existante<\/b><\/i>&gt;<\/span> switch\r\n{\r\n  <span style=\"color:#D35400\">&lt;<i><b>condition 1<\/b><\/i>&gt;<\/span> =&gt; <span style=\"color:#D35400\">&lt;<i><b>expression 1<\/b><\/i>&gt;<\/span>,\r\n  <span style=\"color:#D35400\">&lt;<i><b>condition 2<\/b><\/i>&gt;<\/span> =&gt; <span style=\"color:#D35400\">&lt;<i><b>expression 2<\/b><\/i>&gt;<\/span>,\r\n  \/\/ ...\r\n};<\/code><\/pre>\n<p>Par exemple:<\/p>\n<pre><code class=\"cs\">Vehicle vehicle = new Car{ Name = \"Car1\"  };\r\nstring text = vehicle switch\r\n{\r\n  Car car =&gt; $\"The vehicle is a car: {car.Name}\",\r\n  MotoBike moto =&gt; $\"The vehicle is a motobike: {moto.Name}\",\r\n  null =&gt; \"No vehicle\", \/\/ null pattern\r\n  _ =&gt; throw new InvalidOperationException(\"Vehicle is unknown\"), \/\/ discard pattern (cas par d\u00e9faut)\r\n};\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\"><b>Type pattern<\/b> dans une expression <code>switch<\/code><\/td>\n<td><b>C# 8<\/b><\/td>\n<td><b>Pour tester par rapport \u00e0 un type dans une expression <code>switch<\/code>.<\/b><\/p>\n<pre><code class=\"cs\">Vehicle vehicle = new Car{ Name = \"Car1\"  };\r\nstring text = vehicle switch\r\n{\r\n  Car car =&gt; $\"The vehicle is a car: {car.Name}\",\r\n  MotoBike moto =&gt; $\"The vehicle is a motobike: {moto.Name}\",\r\n  \/\/ [...]\r\n};\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>C# 9<\/b><\/td>\n<td><b>On peut supprimer la variable si on ne l&#8217;utilise pas par la suite.<\/b> <\/p>\n<pre><code class=\"cs\">Vehicle vehicle = new Car{ Name = \"Car1\"  };\r\nstring text = vehicle switch\r\n{\r\n  Car =&gt; \"The vehicle is a car\",\r\n  MotoBike =&gt; \"The vehicle is a motobike\",\r\n  \/\/ [...]\r\n};\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>null pattern<\/b><\/td>\n<td><b>C# 9<\/b><\/td>\n<td><b>A utiliser avec une expression <code>switch<\/code> pour tester si une variable est nulle.<\/b><\/p>\n<pre><code class=\"cs\">Vehicle vehicle = new Car{ Name = \"Car1\"  };\r\nstring text = vehicle switch\r\n{\r\n  \/\/ [...]\r\n  null =&gt; \"No vehicle\", \/\/ null pattern\r\n  \/\/ [...]\r\n};\r\n<\/code><\/pre>\n<p>La valeur <code>\"No vehicle\"<\/code> est affect\u00e9e \u00e0 <code>text<\/code> si vehicle est <code>null<\/code>. <\/td>\n<\/tr>\n<tr>\n<td><b>Discard pattern<\/b><\/td>\n<td><b>C# 9<\/b><\/td>\n<td><b>C&#8217;est le cas par d\u00e9faut dans une expression <code>switch<\/code>.<\/b><\/p>\n<p>Ce cas s&#8217;applique si aucune autre condition n&#8217;est satisfaite (cas par d\u00e9faut).<\/p>\n<pre><code class=\"cs\">string text = vehicle switch\r\n{\r\n  \/\/ [...]\r\n  _ =&gt; throw new InvalidOperationException(\"Vehicle is unknown\"),\r\n};\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>Ajouter des conditions avec <code>when<\/code> dans une expression <code>switch<\/code><\/td>\n<td><b>C# 9<\/b><\/td>\n<td>\n<pre><code class=\"cs\">string text = vehicle switch\r\n{\r\n  Car car <u>when<\/u> string.IsNullOrEmpty(car.Name) =&gt; $\"The vehicle is a car\",\r\n  Car car <u>when<\/u> car.Name.Equals(\"Car1\") =&gt; $\"The vehicle is the first car\",\r\n  Car car =&gt; $\"The vehicle is a car: {car.Name}\",\r\n  _ =&gt; throw new InvalidOperationException(\"Vehicle is unknown\"), \/\/ cas par d\u00e9faut\r\n};\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>var pattern<\/b> avec une expression <code>switch<\/code><\/td>\n<td><b>C# 9<\/b><\/td>\n<td><b>Ce motif s&#8217;applique quelque soit le type de variable (la condition est toujours vraie).<\/b><\/p>\n<p>L&#8217;int\u00e9r\u00eat est d&#8217;effectuer une affectation de l&#8217;expression dans une variable qui pourra \u00e9ventuellement \u00eatre utilis\u00e9e dans le reste de l&#8217;expression.<\/p>\n<pre><code class=\"cs\">string text = vehicle switch\r\n{\r\n  \/\/ [...]\r\n  var unknownType =&gt; $\"The vehicle type {unknownType} is not handled\", \/\/ var pattern\r\n  \/\/ _ =&gt; throw new InvalidOperationException(\"Vehicle is unknown\"), \/\/ Ce code est inatteignable \r\n};\r\n<\/code><\/pre>\n<p>Le motif <i>var<\/i> est toujours vrai donc il est inutile de l&#8217;utiliser avec le motif <i>discard<\/i>.\n<\/td>\n<\/tr>\n<tr>\n<td><b>Tuple pattern<\/b><\/td>\n<td><b>C# 9<\/b><\/td>\n<td><b>Pour tester des conditions dans le cas de <i>tuple<\/i> et d&#8217;une expression <code>switch<\/code>.<\/b><\/p>\n<pre><code class=\"cs\">(int valueAsInt, string valueAsString, float valueAsFloat) tuple = (5, \"5\", 5f);\r\nstring result = tuple switch\r\n{\r\n  (5, \"5\", 5f) =&gt; \"All values are 5\",\r\n  (6, \"5\", 5f) =&gt; \"Int is 6\",\r\n  (7, \"7\", 7f) =&gt; \"All values are 7\",\r\n  (_, _, _) =&gt; \"No matches\", \/\/ Cas par d\u00e9faut \r\n};\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>Positional pattern<\/b> avec un <i>tuple<\/i><\/td>\n<td><b>C# 9<\/b><\/td>\n<td><b>On utilise le caract\u00e8re <code>_<\/code> si on ne veut pas que la condition s&#8217;applique \u00e0 un \u00e9l\u00e9ment d&#8217;un <i>tuple<\/i>.<\/b><\/p>\n<pre><code class=\"cs\">(int valueAsInt, string valueAsString, float valueAsFloat) tuple = (5, \"5\", 5.0f);\r\nstring result = tuple switch\r\n{\r\n  (5, \"5\", 5.0f) =&gt; \"All values are equal\", \/\/ la condition porte sur tous les \u00e9l\u00e9ments\r\n  (5, _, _) =&gt; \"Ints are equal\",            \/\/ la condition porte seulement sur le 1er \u00e9l\u00e9ment\r\n  (_, \"5\", _) =&gt; \"Strings are equal\",       \/\/ la condition porte seulement sur le 2e \u00e9l\u00e9ment\r\n  (_, _, 5.0f) =&gt; \"Floats are equal\",       \/\/ la condition porte seulement sur le 3e \u00e9l\u00e9ment\r\n  (_, _, _) =&gt; \"No matches\",                \/\/ cas par d\u00e9faut\r\n};\r\n<\/code><\/pre>\n<p>On peut cr\u00e9er un nouveau <i>tuple<\/i> pour l&#8217;utiliser dans l&#8217;expression et appliquer une condition avec <code>when<\/code>:<\/p>\n<pre><code class=\"cs\">var tuple = (5, \"6\", 6f);\r\nstring result = tuple switch\r\n{\r\n  (5, \"5\", 5f) =&gt; \"All values are equal\",\r\n  (5, _, _) tupleWithSameInt =&gt; \r\n    $\"Ints are equal (string values are {tupleWithSameInt.Item2})\", \/\/ Utilisation du nouveau tuple dans l'expression\r\n  <b>(_, _, _) matchingTuple<\/b> when matchingTuple.Item1 == 5 &amp;&amp; matchingTuple.Item2 == \"6\" =&gt; \r\n    \"Ints and strings are equal\", \/\/ Utilisation du nouveau tuple avec une condition when\r\n  (_, _, _) =&gt; \"No matches\",\r\n};\r\n<\/code><\/pre>\n<p>Quelques d\u00e9tails sur les conditions utilis\u00e9es:<\/p>\n<ul>\n<li><code>(5, _, _) tupleWithSameInt<\/code>: la condition porte seulement sur le 1<sup>er<\/sup> \u00e9l\u00e9ment qui doit \u00eatre \u00e9gal \u00e0 5. Le <i>tuple<\/i> <code>tupleWithSameInt<\/code> est instanci\u00e9 et utilisable dans le reste de la condition si on utilise <code>when<\/code> ou dans l&#8217;expression.<\/li>\n<li>On peut cr\u00e9er un nouveau <i>tuple<\/i> contenant des \u00e9l\u00e9ments dont les noms sont diff\u00e9rents du <i>tuple<\/i> d&#8217;origine.<br \/>\nPar exemple, si on utilise la condition <code>(var x, var y, var z) =&gt; $\"{x} {y} {z}\"<\/code>, on cr\u00e9e un <i>tuple<\/i> dont les \u00e9l\u00e9ments sont nomm\u00e9s <code>x<\/code>, <code>y<\/code>, <code>z<\/code> qui sont utilisable dans une condition <code>when<\/code> et dans l&#8217;expression.<\/li>\n<li>On peut utiliser le caract\u00e8re <i>discard<\/i> (i.e. <code>_<\/code>) si on cr\u00e9e un nouveau type de <i>tuple<\/i>.<br \/>\nPar exemple, avec la condition <code>(var x, _, _) =&gt; $\"{x}\"<\/code>. Le caract\u00e8re <code>_<\/code> permet d&#8217;ignorer les autres \u00e9l\u00e9ments.<\/li>\n<li>Il n&#8217;est pas possible d&#8217;utiliser une condition avec un <i>tuple<\/i> dont le nombre d&#8217;\u00e9l\u00e9ments n&#8217;est pas \u00e9gal \u00e0 celui du <i>tuple<\/i> d&#8217;origine.<br \/>\nPar exemple, la condition <code>(var x, var y) =&gt; ...<\/code> provoque une erreur de compilation.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td><b>Relational pattern<\/b><\/td>\n<td><b>C# 9<\/b><\/td>\n<td><b>On peut utiliser directement les op\u00e9rateurs <code>&gt;<\/code>, <code>&lt;<\/code>, <code>&gt;=<\/code> et <code>&lt;=<\/code> pour tester une condition.<\/b><\/p>\n<pre><code class=\"cs\">string text = vehicle.GetWheelCount() switch\r\n{\r\n  &gt;= 4 =&gt; \"The vehicle is a car\",\r\n  &lt;= 2 =&gt; \"The vehicle is a motobike\",\r\n  _ =&gt; throw new InvalidOperationException(\"Vehicle is unknown\"),\r\n};\r\n<\/code><\/pre>\n<p>Ce motif peut \u00eatre utilis\u00e9 en dehors d&#8217;une expression <code>switch<\/code>.<\/p>\n<pre><code class=\"cs\">if (vehicle is Car { PassengerCount: &lt;= 4 } car)\r\n{\r\n  \/\/ ...\r\n}\r\n<\/code><\/pre>\n<p>L&#8217;op\u00e9rateur <code>==<\/code> n&#8217;est pas utilisable, pour appliquer une condition d&#8217;\u00e9galit\u00e9, il suffit d&#8217;omettre l&#8217;op\u00e9rateur:<\/p>\n<pre><code class=\"cs\">string text = vehicle.GetWheelCount() switch\r\n{\r\n  4 =&gt; \"The vehicle is a car\",\r\n  2 =&gt; \"The vehicle is a motobike\",\r\n  _ =&gt; throw new InvalidOperationException(\"Vehicle is unknown\"),\r\n};\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>Logical pattern<\/b><\/td>\n<td><b>C# 9<\/b><\/td>\n<td><b>Permet d&#8217;utiliser les op\u00e9rateurs <code>and<\/code>, <code>or<\/code> et <code>not<\/code> pour tester des conditions.<\/b><\/p>\n<pre><code class=\"cs\">string text = vehicle.GetWheelCount() switch\r\n{\r\n  &gt;= 4 <u>and<\/u> &lt;= 6 =&gt; \"The vehicle is a car\",\r\n  &lt;= 2 <u>and<\/u> &gt; 0 =&gt; \"The vehicle is a motobike\",\r\n  _ =&gt; throw new InvalidOperationException(\"Vehicle is unknown\"),\r\n};\r\n\r\nstring text = vehicle switch\r\n{\r\n  null =&gt; \"not instanciated\",\r\n  <u>not<\/u> null =&gt; \"instanciated\", \/\/ Op\u00e9rateur not\r\n};\r\n<\/code><\/pre>\n<p>Ce motif peut \u00eatre utilis\u00e9 en dehors d&#8217;une expression <code>switch<\/code>.<\/p>\n<pre><code class=\"cs\">if (vehicle is Car { PassengerCount: &gt;= 4 and &lt;= 6 and not 5 } car)\r\n{\r\n  \/\/ ...\r\n}\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><b>Property pattern<\/b><\/td>\n<td><b>C# 10<\/b><\/td>\n<td><b>Permet d&#8217;appliquer des conditions sur les propri\u00e9t\u00e9s des objets sans avoir une syntaxe trop lourde.<\/b><\/p>\n<p>Si on consid\u00e8re:<\/p>\n<pre><code class=\"cs\">public class Car\r\n{\r\n  public int PassengerCount;\r\n  public Engine Engine;\r\n}\r\n\r\npublic class Engine\r\n{\r\n  public string EngineType; \r\n  public int Horsepower; \r\n}\r\n<\/code><\/pre>\n<p>On peut \u00e9crire:<\/p>\n<pre><code class=\"cs\">string engineSize = vehicle switch\r\n{\r\n  Car { <u>Engine.EngineType<\/u>: \"V8\" } =&gt; \"Big engine\",\r\n  Car { <u>Engine.EngineType<\/u>: \"Straight-four\" } =&gt; \"Little engine\",\r\n  _ =&gt; \"No matches\"\r\n};\r\n<\/code><\/pre>\n<p>Avec une clause <code>if<\/code>:<\/p>\n<pre><code class=\"cs\">if (vehicle is Car { Engine.EngineType: \"four stroke\" } car)\r\n{\r\n  \/\/ ...\r\n}\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td id=\"cheat-sheet-pattern-matching_list-pattern\"><b>List pattern<\/b><\/td>\n<td><b>C# 11<\/b><\/td>\n<td>Permet d&#8217;\u00e9noncer des conditions applicables sur les \u00e9l\u00e9ments d&#8217;une structure:<\/p>\n<ul>\n<li>Enum\u00e9rable (i.e. <i>countable<\/i>) et indexable ou<\/li>\n<li>Enum\u00e9rable (i.e. <i>countable<\/i>) et dont on peut extraire un sous-groupe (i.e. <i>sliceable<\/i>). <\/li>\n<\/ul>\n<p>La syntaxe g\u00e9n\u00e9rale de ce motif utilise l&#8217;op\u00e9rateur <code>is<\/code>:<\/p>\n<pre><span class=\"bash\"><span style=\"color:#D35400\">&lt;<i><b>structure<\/b><\/i>&gt;<\/span> is <span style=\"color:#D35400\">&lt;<i><b>conditions<\/b><\/i>&gt;<\/span>\r\n<\/span><\/pre>\n<p>Il est possible de combiner plusieurs conditions avec les op\u00e9rateurs <code>and<\/code>, <code>or<\/code> ou <code>not<\/code>:<\/p>\n<pre><span class=\"bash\"><span style=\"color:#D35400\">&lt;<i><b>structure<\/b><\/i>&gt;<\/span> is <span style=\"color:#D35400\">&lt;<i><b>condition 1<\/b><\/i>&gt;<\/span> and <span style=\"color:#D35400\">&lt;<i><b>condition 2<\/b><\/i>&gt;<\/span>\r\n<\/span><\/pre>\n<p>Une condition peut \u00eatre \u00e9nonc\u00e9e en utilisant les syntaxes:<\/p>\n<ul>\n<li><code>[2, 4, 6, 8, 10]<\/code> pour indiquer que la structure doit contenir 5 entiers pr\u00e9cis dans cet ordre.<\/li>\n<li><b>Discard pattern<\/b>: en utilisant le caract\u00e8re <code>_<\/code> pour indiquer n&#8217;importe quel \u00e9l\u00e9ment.<br \/>\nPar exemple:<br \/>\n<code>[2, 4, _, 8, _]<\/code> permet d&#8217;indiquer que la structure doit contenir 3 entiers pr\u00e9cis \u00e0 la 1<sup>\u00e8re<\/sup>, 2<sup>e<\/sup> et 4<sup>e<\/sup> place. Il n&#8217;y a pas de condition sur les \u00e9l\u00e9ments \u00e0 la 3<sup>e<\/sup> et 5<sup>e<\/sup> place.\n<\/li>\n<li><b>Range pattern<\/b>: permet d&#8217;indiquer un interval en utilisant les caract\u00e8res <code>..<\/code>.<br \/>\nPar exemple:<\/p>\n<ul>\n<li><code>[.. , 10]<\/code> permet d&#8217;indiquer que la structure doit se terminer par 10.<\/li>\n<li><code>[.. , 8, 10]<\/code> permet d&#8217;indiquer que la structure doit se terminer par un sous-groupe contenant 8 et 10.<\/li>\n<li><code>[2, .. ]<\/code> permet d&#8217;indiquer que la structure doit commencer par 2.<\/li>\n<li><code>[2, 4, .. ]<\/code> permet d&#8217;indiquer que la structure doit commencer par un sous-groupe contenant 2 et 4.<\/li>\n<li><code>[2, .. , 10]<\/code> permet d&#8217;indiquer que la structure doit commencer par 2 et se terminer par 10. <\/li>\n<\/ul>\n<\/li>\n<li><b>Relational pattern<\/b>: permet d&#8217;indiquer des conditions en utilisant des op\u00e9rateurs de comparaison <code>&lt;<\/code>, <code>&lt;=<\/code>, <code>=&gt;<\/code> ou <code>&gt;<\/code> (<code>==<\/code> ne peut pas \u00eatre utilis\u00e9, pour ajouter une condition d&#8217;\u00e9galit\u00e9 il suffit d&#8217;omettre l&#8217;op\u00e9rateur).<br \/>\nPar exemple:<br \/>\n<code>[2, 4,  &gt;= 6, &lt;= 8, 10]<\/code> permet d&#8217;indiquer que le 3<sup>e<\/sup> \u00e9l\u00e9ment doit \u00eatre sup\u00e9rieur ou \u00e9gale \u00e0 6 et que le 4<sup>e<\/sup> \u00e9l\u00e9ment doit inf\u00e9rieur ou \u00e9gal \u00e0 8.\n<\/li>\n<li><b>var pattern<\/b>: ce motif n&#8217;applique pas de conditions mais permet d&#8217;effectuer des assignations en une seule ligne.<br \/>\nPar exemple:<\/p>\n<pre><code class=\"cs\">var integers = {2, 4, 6, 8, 10};\r\nbool result = integers is [var item1, var item2, .., var itemN];\r\n<\/code><\/pre>\n<p>Cette ligne permet d&#8217;assigner le 1<sup>er<\/sup> \u00e9l\u00e9ment \u00e0 <code>item1<\/code>, le 2<sup>e<\/sup> \u00e9l\u00e9ment \u00e0 <code>item2<\/code> et le dernier \u00e9l\u00e9ment \u00e0 <code>itemN<\/code>. Les autres \u00e9l\u00e9ments sont ignor\u00e9s.\n<\/li>\n<\/ul>\n<p>Il est possible de combiner plusieurs motifs, par exemple le <i>discard pattern<\/i> et le <i>range pattern<\/i>:<\/p>\n<pre><code class=\"cs\">bool result = integers is [_, 4, .., 10];\r\n<\/code><\/pre>\n<p>Pas de conditions sur le 1<sup>er<\/sup> \u00e9l\u00e9ment et des conditions d&#8217;\u00e9galit\u00e9 sur le 2<sup>e<\/sup> et dernier \u00e9l\u00e9ment. <\/p>\n<p>On <b><u>ne peut pas<\/u><\/b> utiliser 2 fois le <i>range pattern<\/i>:<\/p>\n<pre><code class=\"cs\">bool result = integers is [2, .., 4, .., 10]; \/\/ NE COMPILE PAS\r\n<\/code><\/pre>\n<p>On peut combiner le <i>var pattern<\/i> avec d&#8217;autres motifs:<\/p>\n<pre><code class=\"cs\">bool result = integers is [var item1, .., var itemN];\r\n<\/code><\/pre>\n<p>Permet d&#8217;assigner le 1<sup>er<\/sup> et le dernier \u00e9l\u00e9ment de la structure.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"references\">\n<header>R\u00e9f\u00e9rences<\/header>\n<ul>\n<li>List patterns: <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/csharp\/language-reference\/proposals\/csharp-11.0\/list-patterns\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/csharp\/language-reference\/proposals\/csharp-11.0\/list-patterns<\/a><\/li>\n<li>C# 11 \/ .NET 7 &#8211; List patterns: <a href=\"https:\/\/fr.linkedin.com\/pulse\/c-11-net-7-list-patterns-james-ravaille\">https:\/\/fr.linkedin.com\/pulse\/c-11-net-7-list-patterns-james-ravaille<\/a><\/li>\n<li>C# 11.0: List patterns: <a href=\"https:\/\/www.c-sharpcorner.com\/blogs\/c-sharp-110-list-patterns\">https:\/\/www.c-sharpcorner.com\/blogs\/c-sharp-110-list-patterns<\/a><\/li>\n<li>Additions to pattern matching in C# 10 and C# 11: <a href=\"https:\/\/renatogolia.com\/2022\/11\/18\/additions-to-pattern-matching-csharp-10-11\/\">https:\/\/renatogolia.com\/2022\/11\/18\/additions-to-pattern-matching-csharp-10-11\/<\/a><\/li>\n<li>C# 9.0: Improved Pattern Matching: <a href=\"https:\/\/www.thomasclaudiushuber.com\/2021\/02\/18\/c-9-0-improved-pattern-matching\/\">https:\/\/www.thomasclaudiushuber.com\/2021\/02\/18\/c-9-0-improved-pattern-matching\/<\/a><\/li>\n<li>Pattern-matching changes for C# 9.0: <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/csharp\/language-reference\/proposals\/csharp-9.0\/patterns3\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/csharp\/language-reference\/proposals\/csharp-9.0\/patterns3<\/a><\/li>\n<li>Welcome to C# 9.0: <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/welcome-to-c-9-0\/\">https:\/\/devblogs.microsoft.com\/dotnet\/welcome-to-c-9-0\/<\/a><\/li>\n<li>Tutorial: Use pattern matching to build type-driven and data-driven algorithms: <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/csharp\/fundamentals\/tutorials\/pattern-matching\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/csharp\/fundamentals\/tutorials\/pattern-matching<\/a><\/li>\n<li>What&#8217;s new in C# 11: <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Cet article est un aide-m\u00e9moire des motifs les plus courants de pattern matching suivant les versions de C# pour aider \u00e0 se rappeler de la syntaxe: Motif Version C# Remarques et exemples Null pattern C# 7.0 Test pour v\u00e9rifier si une variable est nulle Vehicle vehicle = new Car(); if (vehicle is null) Console.WriteLine($&#8221;{nameof(vehicle)} is&#8230;<\/p>\n<p class=\"continue-reading\"><a class=\"more-link\" href=\"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/\">Continuer \u00e0 lire<i class=\"fa fa-caret-right\"><\/i><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4,3,214],"tags":[589,590,365,402,478,370],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.12 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Aide-m\u00e9moire pattern matching C# - Blog .NET<\/title>\n<meta name=\"description\" content=\"Cet article est un aide-m\u00e9moire des motifs les plus courants de pattern matching en C# pour aider \u00e0 se rappeler de la syntaxe.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Aide-m\u00e9moire pattern matching C# - Blog .NET\" \/>\n<meta property=\"og:description\" content=\"Cet article est un aide-m\u00e9moire des motifs les plus courants de pattern matching en C# pour aider \u00e0 se rappeler de la syntaxe.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog .NET\" \/>\n<meta property=\"article:published_time\" content=\"2024-07-13T09:10:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-13T23:58:38+00:00\" \/>\n<meta name=\"author\" content=\"Mathias Montantin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/matmanhatan\" \/>\n<meta name=\"twitter:site\" content=\"@matmanhatan\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mathias Montantin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/\"},\"author\":{\"name\":\"Mathias Montantin\",\"@id\":\"https:\/\/cdiese.fr\/#\/schema\/person\/00e738f48c3a6a4274743b9f1eb73fee\"},\"headline\":\"Aide-m\u00e9moire pattern matching C#\",\"datePublished\":\"2024-07-13T09:10:38+00:00\",\"dateModified\":\"2025-06-13T23:58:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/\"},\"wordCount\":1176,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/cdiese.fr\/#\/schema\/person\/00e738f48c3a6a4274743b9f1eb73fee\"},\"keywords\":[\"C# 10.0\",\"C# 11.0\",\"C# 7.0\",\"C# 8.0\",\"C# 9.0\",\"pattern matching\"],\"articleSection\":[\".NET\",\"C#\",\"Cheat sheet\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/\",\"url\":\"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/\",\"name\":\"Aide-m\u00e9moire pattern matching C# - Blog .NET\",\"isPartOf\":{\"@id\":\"https:\/\/cdiese.fr\/#website\"},\"datePublished\":\"2024-07-13T09:10:38+00:00\",\"dateModified\":\"2025-06-13T23:58:38+00:00\",\"description\":\"Cet article est un aide-m\u00e9moire des motifs les plus courants de pattern matching en C# pour aider \u00e0 se rappeler de la syntaxe.\",\"breadcrumb\":{\"@id\":\"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/cdiese.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Aide-m\u00e9moire pattern matching C#\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cdiese.fr\/#website\",\"url\":\"https:\/\/cdiese.fr\/\",\"name\":\"Blog .NET\",\"description\":\"Quelques d\u00e9couvertes, trucs et astuces sur .NET en g\u00e9n\u00e9ral\",\"publisher\":{\"@id\":\"https:\/\/cdiese.fr\/#\/schema\/person\/00e738f48c3a6a4274743b9f1eb73fee\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cdiese.fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/cdiese.fr\/#\/schema\/person\/00e738f48c3a6a4274743b9f1eb73fee\",\"name\":\"Mathias Montantin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/cdiese.fr\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/cdiese.fr\/wp-content\/uploads\/2017\/10\/csharp_favicon.png\",\"contentUrl\":\"https:\/\/cdiese.fr\/wp-content\/uploads\/2017\/10\/csharp_favicon.png\",\"width\":109,\"height\":112,\"caption\":\"Mathias Montantin\"},\"logo\":{\"@id\":\"https:\/\/cdiese.fr\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/twitter.com\/https:\/\/twitter.com\/matmanhatan\"],\"url\":\"https:\/\/cdiese.fr\/author\/mitchoum\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Aide-m\u00e9moire pattern matching C# - Blog .NET","description":"Cet article est un aide-m\u00e9moire des motifs les plus courants de pattern matching en C# pour aider \u00e0 se rappeler de la syntaxe.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/","og_locale":"fr_FR","og_type":"article","og_title":"Aide-m\u00e9moire pattern matching C# - Blog .NET","og_description":"Cet article est un aide-m\u00e9moire des motifs les plus courants de pattern matching en C# pour aider \u00e0 se rappeler de la syntaxe.","og_url":"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/","og_site_name":"Blog .NET","article_published_time":"2024-07-13T09:10:38+00:00","article_modified_time":"2025-06-13T23:58:38+00:00","author":"Mathias Montantin","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/matmanhatan","twitter_site":"@matmanhatan","twitter_misc":{"\u00c9crit par":"Mathias Montantin","Dur\u00e9e de lecture estim\u00e9e":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/#article","isPartOf":{"@id":"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/"},"author":{"name":"Mathias Montantin","@id":"https:\/\/cdiese.fr\/#\/schema\/person\/00e738f48c3a6a4274743b9f1eb73fee"},"headline":"Aide-m\u00e9moire pattern matching C#","datePublished":"2024-07-13T09:10:38+00:00","dateModified":"2025-06-13T23:58:38+00:00","mainEntityOfPage":{"@id":"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/"},"wordCount":1176,"commentCount":0,"publisher":{"@id":"https:\/\/cdiese.fr\/#\/schema\/person\/00e738f48c3a6a4274743b9f1eb73fee"},"keywords":["C# 10.0","C# 11.0","C# 7.0","C# 8.0","C# 9.0","pattern matching"],"articleSection":[".NET","C#","Cheat sheet"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/","url":"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/","name":"Aide-m\u00e9moire pattern matching C# - Blog .NET","isPartOf":{"@id":"https:\/\/cdiese.fr\/#website"},"datePublished":"2024-07-13T09:10:38+00:00","dateModified":"2025-06-13T23:58:38+00:00","description":"Cet article est un aide-m\u00e9moire des motifs les plus courants de pattern matching en C# pour aider \u00e0 se rappeler de la syntaxe.","breadcrumb":{"@id":"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/cdiese.fr\/cheat-sheet-pattern-matching\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/cdiese.fr\/"},{"@type":"ListItem","position":2,"name":"Aide-m\u00e9moire pattern matching C#"}]},{"@type":"WebSite","@id":"https:\/\/cdiese.fr\/#website","url":"https:\/\/cdiese.fr\/","name":"Blog .NET","description":"Quelques d\u00e9couvertes, trucs et astuces sur .NET en g\u00e9n\u00e9ral","publisher":{"@id":"https:\/\/cdiese.fr\/#\/schema\/person\/00e738f48c3a6a4274743b9f1eb73fee"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cdiese.fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":["Person","Organization"],"@id":"https:\/\/cdiese.fr\/#\/schema\/person\/00e738f48c3a6a4274743b9f1eb73fee","name":"Mathias Montantin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/cdiese.fr\/#\/schema\/person\/image\/","url":"https:\/\/cdiese.fr\/wp-content\/uploads\/2017\/10\/csharp_favicon.png","contentUrl":"https:\/\/cdiese.fr\/wp-content\/uploads\/2017\/10\/csharp_favicon.png","width":109,"height":112,"caption":"Mathias Montantin"},"logo":{"@id":"https:\/\/cdiese.fr\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/twitter.com\/https:\/\/twitter.com\/matmanhatan"],"url":"https:\/\/cdiese.fr\/author\/mitchoum\/"}]}},"_links":{"self":[{"href":"https:\/\/cdiese.fr\/wp-json\/wp\/v2\/posts\/2311"}],"collection":[{"href":"https:\/\/cdiese.fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cdiese.fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cdiese.fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/cdiese.fr\/wp-json\/wp\/v2\/comments?post=2311"}],"version-history":[{"count":17,"href":"https:\/\/cdiese.fr\/wp-json\/wp\/v2\/posts\/2311\/revisions"}],"predecessor-version":[{"id":2412,"href":"https:\/\/cdiese.fr\/wp-json\/wp\/v2\/posts\/2311\/revisions\/2412"}],"wp:attachment":[{"href":"https:\/\/cdiese.fr\/wp-json\/wp\/v2\/media?parent=2311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cdiese.fr\/wp-json\/wp\/v2\/categories?post=2311"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cdiese.fr\/wp-json\/wp\/v2\/tags?post=2311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}