11
votes

Interrupteur en ligne / déclaration de cas en C #

Je suis sur un coup étrange de voir combien de lignes je peux faire mon code. Existe-t-il un moyen de condenser cela à des déclarations de cas en ligne?

    switch (FIZZBUZZ)
    {
      case "Fizz": //Do one process
      case "Buzz": //Do one process
      case "FizzBuzz": //Do one process
    }


2 commentaires

Descendez ce coup de pied, certaines choses peuvent être faites bien comme telles, mais vous allez généralement commencer à écrire de moins en moins de code lisible ..


Je pense que cela nécessite une mise à jour car cela est possible en C # 8


13 Réponses :


26
votes

Si vous voulez condenser des choses, vous pouvez simplement mettre des choses sur une ligne (imaginons que "faire un processus est un appel à console.writeline ): xxx < p> Si vous voulez avoir envie de vous fier, vous pouvez créer une carte des chaînes à des actions telles que ceci: xxx

et vous pouvez ensuite appeler la méthode comme celle-ci: < Pré> xxx


2 commentaires

Eh bien, mais j'ai "guérisseur" et "guidon" pour les deux appels. puis appelez-les à la fois pour Fizzbuzz. Je voudrais répéter le code de cette façon. Autant que j'aime condenser, j'aime l'efficacité. :)


@JIM - J'aime l'exactitude, la lisibilité et la maintenabilité. Je suis heureux que dans l'exemple de Fizzbuzz au moins, nos intérêts peuvent coïncider. :-)



1
votes

Vous devez toujours avoir une déclaration de pause afin de quitter le commutateur autre que celui que vous pouvez le faire comme vous le mentionnez

  switch (FIZZBUZZ)
    {
      case "Fizz": /*Do one process*/break;
      case "Buzz": /*Do one process*/break;
      case "FizzBuzz": /*Do one process*/break;
    }


0 commentaires

0
votes

Bien un moyen facile serait: xxx

qui n'est qu'une ligne chacune. Mais il y a plusieurs déclarations par ligne ...


0 commentaires

1
votes

Eh bien, si vous êtes vraiment intéressé par le moins de les lignes de code vous pouvez écrire: xxx

Je ne le recommanderais pas cependant. < P> Il est difficile de dire exactement ce que vous demandez, essayez-vous de tomber entre les cas ou simplement de supprimer des accolades?


3 commentaires

En fait, j'ai fait ça à un collègue qui m'a irrité une fois. A écrit une classe entière sur une seule ligne.


J'essaie de supprimer les accolades.


@JIM: Autre que les accolades autour du bloc de commutation lui-même, vous ne besoin les autres accolades, alors simplement les supprimer. Bien que si vous créez des variables dans l'un de ces cas, il est suggéré de les avoir à assurer la sécurité de la portée.



0
votes

Je ne sais aucun moyen de le faire, tout en conservant une certaine lisibilité, autre que l'évidence: xxx


0 commentaires

0
votes

Vous pouvez mettre autant de code sur une ligne que vous le souhaitez avec C #.

Comme Andrew dit.

Personnellement, ma préférence est de laisser de l'espace blanc car il permet une lecture plus facile du code, mais je suis à nouveau le seul dev ici qui commente son code ou écrit des méthodes et des fonctions suffisamment petites pour pouvoir numériser rapidement le code pour voir exactement ce qu'il fait. :)


0 commentaires

0
votes

Vous n'avez pas besoin des accolades frisées pour les déclarations de cas, mais avez-vous besoin d'une déclaration de pause pour chaque cas? Sinon, vous ne pouvez pas vraiment faire beaucoup


0 commentaires

9
votes

Avec l'hypothèse que cela est purement ésotérique et que vous ne serez pas tenté de l'utiliser dans un système de production, vous pouvez abuser des arbres d'expression: xxx

interrupteur est une méthode d'extension: xxx


1 commentaires

Je l'aime bien! manière intéressante de faire des choses.



14
votes

FYI, si quelqu'un cherche une déclaration de cas de commutation sténographique en ligne pour retourner une valeur, j'ai trouvé la meilleure solution pour moi était d'utiliser l'opérateur ternaire plusieurs fois:

string FizzBuzz = "Fizz";
FizzBuzz = FizzBuzz == "Fizz" ? MethodThatReturnsAString("Fizz") : (FizzBuzz == "Buzz" ? MethodThatReturnsAString("Buzz") : MethodThatReturnsAString("FizzBuzz"));


1 commentaires

Qu'en est-il de la performance entre cela et d'utiliser une boucle "externe" ?.



0
votes

Affiche nécromancienne ici

Alors j'ai pris cela comme un défi. Au lieu des réponses habituelles des déclarations "Il suffit d'utiliser Switch..Case Syntaxe", je lui ai fait un défi codant de compétences et de connaissances (pas que j'ai beaucoup de).

Configuration < P> Utiliser xxx

implémentation xxx


0 commentaires

5
votes

in c # 8, vous pouvez faire quelque chose comme ceci xxx

ceci est équivalent à xxx


1 commentaires

Oui, mais vous retournez une valeur. Le défi consiste à effectuer une action.



0
votes

Un défi consiste à utiliser C # 8 Switch Expressions

Le problème est que le corps de chaque branche est une expression, pas un groupe d'instructions.

Vous pouvez contourner cela en faisant de la ramification de chaque branche code> action objet.

Notez la syntaxe: Si j'applique explicitement l'une des expressions sur le type Action , le compilateur jette implicitement chacun des autres expressions. J'ai choisi de lancer la dernière expression (par défaut). xxx


0 commentaires

39
votes

Introduit dans C # 8.

Vous pouvez maintenant effectuer des opérations de commutation comme ceci: P>

string FIZZBUZZ = "fizz";
string result = String.Empty;

_= (FIZZBUZZ switch
{
    "fizz" => () =>
    {
        Console.WriteLine("fizz");
        result = "fizz";
    },
    "fuzz" => () =>
    {
        Console.WriteLine("fuzz");
        result = "fuzz";
    },
    _ => new Action(() => { })
});


0 commentaires