C#中如果textBox包含字符,return将字符的含义放入Label

In C# if textBox contains character, return the meaning of the character into the Label

你会如何处理这个... 我想要一个文本框,用户可以在其中输入某些字符,如下图所示:

在文本框的底部,我想有一些 Label 控件可以对应于文本框的输入。例如,如果用户在 TextBox 中键入 AOC-STGF,Label1 将显示 "Add On Card"Label2 将显示 "Standard"Label3 将显示"10GbE", Label4 会显示 "Fortville" 等等...

大致如下:

我正在考虑一堆 if 语句,但这不是一个好方法,而且很长。此外,我还必须考虑重复字符,例如,您可以在 TextBox.

中两次提及 "G"

我当然不会为此使用正则表达式。我会使用一种简单的管道类型方法,其中一组处理器分别处理消息的下一部分。这很有效,因为过程 运行s 是线性的。我们在这里遇到的唯一问题是,如果一个可选步骤能够将第一个字符从后续步骤中抽出。您的数据似乎说明了这一点。

首先我们定义 ParserStep 的外观。我们为数据(字符代码、字符串)使用元组列表,为我们的 TODO 操作使用谓词:

public class ParserStep
{
    public Action<string> ToDo { get; set; }
    public List<Tuple<string, string>> Data { get; set; } = new List<Tuple<string, string>>();
    public bool Optional { get; set; } = false;

    public string ProcessStep(string message)
    {
        foreach (var d in Data)
        {
            if (message.StartsWith(d.Item1))
            {
                ToDo(d.Item2);
                return message.Substring(d.Item1.Length);
            }
        }
        if (!Optional)
            throw new InvalidDataException();
        return message;
    }
}

然后我们创建一个 class,它知道如何 运行 步骤并处理修剪和整理:

public class Parser
{
    public List<ParserStep> Steps { get; set; } = new List<ParserStep>();

    public void Run(string message)
    {
        foreach (var step in Steps)
        {
            if (string.IsNullOrEmpty((message)))
                return;
            message = step.ProcessStep(message);
            message = message.TrimStart('-');
        }
    }
}

现在我们可以构建 ParserStep 对象,在其上设置数据,告诉它们如何处理代码的值,并将它们添加到列表中。然后我们将它们交给将循环遍历它们的 Parser 对象。

这是一个快速示例:

       var p = new Parser()
        {
            Steps =
            {
                new ParserStep()
                {
                    Data = { Tuple.Create("AOC", "Add On Card") },
                    ToDo = (a => Console.WriteLine($"Product Family = {a}")),
                    Optional = false
                },
                new ParserStep()
                {
                    Data =
                    {
                        Tuple.Create("S", "Standard"),
                        Tuple.Create("P", "Proprietary"),
                        Tuple.Create("C", "MicroLP"),
                        Tuple.Create("MH", "SIOM Hybrid"),
                        Tuple.Create("M", "Super IO")
                    },
                    ToDo = (a => Console.WriteLine($"Form Factor = {a}")),
                    Optional = false
                }
            }
        };

请注意,作为 ToDo,我正在写入控制台。这是您在标签上设置值的地方!

那我们就这样称呼它:

p.Run("AOC-S");

这个简单的示例包含硬编码的所有内容,但您可以轻松修改以从数据库或其他任何内容中读取。最后,下面是一个完整的 .NET Core 控制台应用程序,用于显示完整的代码工作:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;

namespace CoreConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var p = new Parser()
            {
                Steps =
                {
                    new ParserStep()
                    {
                        Data = { Tuple.Create("AOC", "Add On Card") },
                        ToDo = (a => Console.WriteLine($"Product Family = {a}")),
                        Optional = false
                    },
                    new ParserStep()
                    {
                        Data =
                        {
                            Tuple.Create("S", "Standard"),
                            Tuple.Create("P", "Proprietary"),
                            Tuple.Create("C", "MicroLP"),
                            Tuple.Create("MH", "SIOM Hybrid"),
                            Tuple.Create("M", "Super IO")
                        },
                        ToDo = (a => Console.WriteLine($"Form Factor = {a}")),
                        Optional = false
                    }
                }
            };
            p.Run("AOC-S");
            Console.ReadLine();
        }
    }

    public class ParserStep
    {
        public Action<string> ToDo { get; set; }
        public List<Tuple<string, string>> Data { get; set; } = new List<Tuple<string, string>>();
        public bool Optional { get; set; } = false;

        public string ProcessStep(string message)
        {
            foreach (var d in Data)
            {
                if (message.StartsWith(d.Item1))
                {
                    ToDo(d.Item2);
                    return message.Substring(d.Item1.Length);
                }
            }
            if (!Optional)
                throw new InvalidDataException();
            return message;
        }
    }

    public class Parser
    {
        public List<ParserStep> Steps { get; set; } = new List<ParserStep>();

        public void Run(string message)
        {
            foreach (var step in Steps)
            {
                if (string.IsNullOrEmpty((message)))
                    return;
                message = step.ProcessStep(message);
                message = message.TrimStart('-');
            }
        }
    }

}

干杯,谢谢你给我这个练习!