Je suis désolé si le titre est faux, je ne savais pas comment s'appelle ce que je veux faire.

Je commence en C # (Python est mon fort).

La chose que je veux faire en C # est, je ne sais pas comment l'expliquer, mais je vais expliquer comment vous pouvez le faire en python.

Je veux afficher un message différent en fonction de l'action, mais je ne veux pas utiliser beaucoup d'If.

En ce moment, en C #, j'ai une zone de texte avec l'événement KeyDown, donc si j'appuie sur le numéro, je veux que le spectacle "Vous avez appuyé sur un numéro" mais si j'appuie sur un point (.), Il me dira "Vous avez appuyé sur un point".

En python je ferais comme ça:

def keyDownEvent(self, k):
    if k.key.text in [1,2,3,4,5,6,7,8,9,0]:
        print(f"You pressed {k.key.text}")
    else:
        print("You pressed " + {"decimal": "dot", "OemPeriod": "dot"}[k.key.text])

Voici un exemple de ce que je ferais en python, et à l'intérieur de ce dictionnaire temporaire, je peux mettre plus de choses.

Comment puis-je faire quelque chose comme ça en C #?

c#
-1
Jess Jss 26 janv. 2019 à 18:30

3 réponses

Meilleure réponse

Je viens de lancer quelques options rapides basées sur ce que je pensais que vous cherchiez. (Ceci est juste une application console, vous pouvez donc l'essayer rapidement):

Edit: Changé pour rendre la partie de la cartographie plus évidente pour la question de "trucs" d'infrastructure:

namespace ConsoleApp1
{
    public class Program
    {
        private static void Main(string[] args)
        {
            var done = false;

            Console.WriteLine("Press Q to Exit");
            while (!done)
            {
                var key = GrabUpperKey();

                var mapped1 = MapPlain(key);
                var mapped2 = MapRegexDynamic(key);
                var mapped3 = MapRegexConditional(key);

                Console.WriteLine($"You typed a {mapped1}, {mapped2}, {mapped3}");
                done = key == "Q";
            }
        }

        private static string MapRegexConditional(string key)
        {
            if (Regex.IsMatch(key, "^[0-9]$"))
            {
                return "Number";
            }

            if (Regex.IsMatch(key, @"^[\.]$"))
            {
                return "Dot";
            }

            if (Regex.IsMatch(key, @"^[A-Z]$"))
            {
                return "Letter";
            }

            return "N/A";
        }

        private static string MapRegexDynamic(string key)
        {
            var mappings = new Dictionary<string, string>()
            {
                { "^\\.$", "Dot" },
                { "^[0-9]$", "Number" },
                { "^[A-Z]$", "Letter" }
            };

            var firstMatch = mappings
                .Where(mapping => Regex.IsMatch(key.ToString(), mapping.Key))
                .Select(mapping => mapping.Value)
                .FirstOrDefault();

            return firstMatch ?? "N/A";
        }

        private static string MapPlain(string key)
        {
            var mapping = new Dictionary<string, string>()
            {
                { ".", "Dot" },
                { "0", "Number" },
                { "1", "Number" },
                { "2", "Number" },
                { "3", "Number" },
                { "4", "Number" },
                { "5", "Number" },
                { "6", "Number" },
                { "7", "Number" },
                { "8", "Number" },
                { "9", "Number" },
                { "A", "Letter" },
                { "Q", "Letter" }
            };

            return !mapping.ContainsKey(key) ? "N/A" : mapping[key];
        }

        private static string GrabUpperKey()
        {
            return Console.ReadKey().KeyChar.ToString().ToUpperInvariant(); // Just doing this to not have to handle upper and lower chars
        }
    }
}
0
Mirko 26 janv. 2019 à 16:22

Vous pouvez utiliser un boîtier de commutation.

var keyChar = Convert.ToChar(e.KeyValue); 

switch (keyChar)
{
   case var _ when new []{'1','2','3','4','5','6','7','8','9','0' }.Contains(keyChar):
      // Its a number, Show message in Text/MessageBox
      break;
   case var _ when keyChar.Equals("."):
      // Its a Dot, Show message in Text/MessageBox
      break;
//so on....
}

Notez que le premier cas (nombres) peut également être mis en correspondance avec l'expression régulière. Vous pouvez réécrire le premier cas sous la forme.

case var _ when Regex.IsMatch(keyChar.ToString(), @"\d"):

Veuillez noter qu'il n'est pas tout à fait nécessaire de convertir en char (première ligne). Vous pouvez également écrire le commutateur sur KeyCode (dans ce cas, les conditions doivent être basées sur l'énumération System.Windows.Form.Keys).

1
Anu Viswan 26 janv. 2019 à 15:57

Avec la méthode linq Contains, vous obtenez quelque chose de similaire.

var value = int.Parse(Console.ReadLine());
if (new List<int> { 1, 2, 3, 4, 5 }.Contains(value))
    {
        Console.WriteLine("You clicked " + value);
    }
-1
Samuel Wahlberg 26 janv. 2019 à 15:40