91 votes

Utilisez string.Contains() avec switch()

Je suis en train de faire une application C# où j'utilise

if ((message.Contains("test")))
{
   Console.WriteLine("oui");
} else if ((message.Contains("test2"))) {
   Console.WriteLine("oui pour test2");
}

Y aurait-il un moyen de changer les déclarations if() en switch() ?

165voto

Lakedaimon Points 384

La syntaxe finale correcte pour la réponse de [M. C].

Avec la sortie de VS2017RC et son support C#7, cela fonctionne de cette manière :

switch(message)
{
    case string a when a.Contains("test2"): return "no";
    case string b when b.Contains("test"): return "yes";
}

Vous devez prendre soin de l'ordre des cas car le premier match sera choisi. C'est pourquoi "test2" est placé avant test.

1 votes

+1 Cela fonctionne parfaitement maintenant. Et pour ceux qui se demandent, vous pouvez accéder à la valeur du cas via la variable "x" dans ce scénario.

0 votes

De plus, vous pouvez utiliser n'importe quel nom de var-excepté celui dans l'instruction switch à évaluer. Ensuite, vous pouvez vous référer à la variable/expression d'origine dans le code qui suit.

0 votes

@Patrick, pouvez-vous clarifier ce que vous entendez par la variable "x" ? Désolé je suis sûr que c'est évident.

43voto

Jesús Jiménez Points 101

Cela fonctionnera en C# 8 en utilisant une expression switch

var message = "Some test message";

message = message switch
{
    string a when a.Contains("test") => "yes",
    string b when b.Contains("test2") => "yes for test2",
    _ => "rien à dire"
};

Pour plus de références https://learn.microsoft.com/fr-fr/dotnet/csharp/language-reference/operators/switch-expression

9 votes

Je trouve les expressions de commutation (switch) une syntaxe très étrange qui est difficile à mémoriser. Je me retrouve toujours à rechercher si je ne l'ai pas utilisé depuis quelques mois...

36voto

Teoman Soygul Points 17544

Non, l'instruction switch nécessite des constantes de temps de compilation. L'instruction message.Contains("test") peut évaluer vrai ou faux en fonction du message, donc ce n'est pas une constante et ne peut pas être utilisée comme un 'case' pour l'instruction switch.

2 votes

Donc je ne peux utiliser que if()? C'est assez désordonné :(

0 votes

@zad0xsis: En avez-vous beaucoup? Si c'est le cas, vous pourriez potentiellement abstraire un peu l'idée...

0 votes

Oui, j'ai beaucoup de if() :(

34voto

Tigran Points 41381

Si vous voulez simplement utiliser switch/case, vous pouvez faire quelque chose comme ça, pseudo-code :

    string message = "test de la mienne";
    string[] keys = new string[] {"test2",  "test"  };

    string sKeyResult = keys.FirstOrDefault(s=>message.Contains(s));

    switch (sKeyResult)
    {
        case "test":
            Console.WriteLine("oui pour test");
            break;
        case "test2":
            Console.WriteLine("oui pour test2");
            break;
    }

Mais si la quantité de clés est grande, vous pouvez simplement la remplacer par un dictionnaire, comme ceci :

static Dictionary dict = new Dictionary();
static void Main(string[] args)
{
    string message = "test de la mienne";      

    // cela se produit seulement une fois, lors de l'initialisation, ceci n'est qu'un code d'exemple
    dict.Add("test", "oui");
    dict.Add("test2", "oui2"); 

    string sKeyResult = dict.Keys.FirstOrDefault(s=>message.Contains(s));

    Console.WriteLine(dict[sKeyResult]); //ou `TryGetValue`... 
 }

0 votes

J'ai supprimé de string sKeyResult = keys.FirstOrDefault(s=>message.Contains(s)); et ça fonctionne toujours correctement.

0 votes

Cette pensée sort vraiment des sentiers battus. Joli !

4voto

shenhengbin Points 2630

Vous pouvez d'abord faire la vérification, puis utiliser le switch comme vous le souhaitez.

Par exemple:

string str = "paramètre"; // test1..test2..test3....

if (!message.Contains(str)) return ;

Ensuite

switch(str)
{
  case "test1" : {} break;
  case "test2" : {} break;
  default : {} break;
}

41 votes

Je ne comprends pas cette réponse.

0 votes

Dans le scénario de str = "test1, test2"; le cas "test1" ne fonctionnera pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X