c# 4.0 - C# 中开关语句的多个变量

本文关键字:语句 变量 开关 | 更新日期: 2023-09-27 17:55:22

我是新来的,但或多或少不时地浏览论坛。

我正在使用 c#,这是一个家庭作业,但我正在尝试使用 switch 语句将 7 个 ref 字符变量从一个字母转换为相应的数字。我的问题是(如果可能的话)如何(如果可能的话)为一个开关语句使用多个变量。案例将永远相同,我宁愿每个 switch 语句没有 27 个案例用于 7 个语句。老实说,我更愿意做一组 if 语句,但这是不可能的。

任何协助将不胜感激。谢谢。

这是我针对此特定部分的 c# 代码:

static int ToDigit(ref char ch1, ref char ch2, ref char ch3, ref char ch4, ref char ch5, ref char ch6, ref char ch7)
{
        ProcessInput(ref ch1, ref ch2, ref ch3, ref ch4, ref ch5, ref ch6, ref ch7);
        ch1 = char.ToUpper(ch1);
        ch2 = char.ToUpper(ch2);
        ch3 = char.ToUpper(ch3);
        ch4 = char.ToUpper(ch4);
        ch5 = char.ToUpper(ch5);
        ch6 = char.ToUpper(ch6);
        ch7 = char.ToUpper(ch7);
        switch (ch1)
        {
            case 'A':
                Console.Write(2);
                break;
            case 'B':
                Console.Write(2);
                break;
            case 'C':
                Console.Write(2);
                break;
            case 'D':
                Console.Write(3);
                break;
            case 'E':
                Console.Write(3);
                break;
            case 'F':
                Console.Write(3);
                break;
            case 'G':
                Console.Write(3);
                break;
            case 'H':
                Console.Write(3);
                break;
            case 'I':
                Console.Write(3);
                break;
            case 'J':
                Console.Write(3);
                break;
            case 'K':
                Console.Write(3);
                break;
            case 'L':
                Console.Write(3);
                break;
            case 'M':
                Console.Write(3);
                break;
            case 'N':
                Console.Write(3);
                break;
            case 'O':
                Console.Write(3);
                break;
            case 'P':
                Console.Write(3);
                break;
            case 'Q':
                Console.Write(3);
                break;
            case 'R':
                Console.Write(3);
                break;
            case 'S':
                Console.Write(3);
                break;
            case 'T':
                Console.Write(3);
                break;
            case 'U':
                Console.Write(3);
                break;
            case 'V':
                Console.Write(3);
                break;
            case 'W':
                Console.Write(3);
                break;
            case 'X':
                Console.Write(3);
                break;
            case 'Y':
                Console.Write(3);
                break;
            case 'Z':
                Console.Write(3);
                break;
            default:
                Console.Write(-1);
                return -1;

c# 4.0 - C# 中开关语句的多个变量

好的,这是一个家庭作业,所以绝对要求你使用开关而不是字典。 这很好,你需要学习语法和概念,但是......

我认为还有其他一些应该解决的问题,一些比语法更基本的东西——这就是最少工作的原则。 任何大小的程序都被分解为多个部分、方法、子、函数、对象、例程、模块等。

每个部分都应该做尽可能多的工作,以便完成该部分需要做的事情。 ProcessInput 函数采用七个参数,然后对所有七个参数执行完全相同 (*3) 的操作。

为了有效地/维护地做到这一点,所有代码仍然在一个函数中,你必须添加一个额外的步骤,迭代七个参数。 这意味着为了让事情变得更好,你增加了你的函数做的事情的数量。 你已经增加了这块所做的工作,但你应该始终努力减少给定部分所做的工作。 "完美不是在没有更多可添加的时候实现的,而是在没有什么可带走的时候实现的"。 你是怎么做到的?通过添加一个做得较少的部分,然后将工作委托给该部分。

简而言之,如果您采用采用七个参数的现有 ProcessInput 函数,并创建一个采用单个参数的 ProcessInput 函数,则最终将得到更多的 PIECES,但每个部分将做更少的工作。 这意味着如果需求发生变化,该部分将更容易理解、更易于设计、更易于调试和修改。

此时,您甚至不必有一个循环来使该过程更容易理解。 您可以连续七次调用新函数。

*当前方法执行的操作之一是在调用变量的方法中更改变量的内容。 这是因为您使用的是 ref 参数。 我会质疑你是否真的需要这样做。 它很少需要,而且经常被误解和误用。 例如,在撰写本文时,所有现有的答案都错过了它,如果它实际上是一个实际要求,它们都不起作用。

我希望这个答案对您有所帮助,即使它不包含代码。

如果需要使用 switch 语句,那么 Gabriel GM 上面的答案是最好的。但是,有更好的方法可以做到这一点;通常的方法是有一个字典对象并执行简单的键查找:

private const int NotFound = -1;
private static readonly IDictionary<char, int> MyLookup = new Dictionary<char, int>
{
    { 'A', 2 },
    { 'B', 2 },
    { 'C', 2 },
    { 'D', 3 },
    { 'E', 3 },
    { 'F', 3 },
    // and so on
};
public int DoStuff(char ch1)
{
    if (MyLookup.ContainsKey(ch1))
    {
        Console.WriteLine(MyLookup[ch1]);
    }
    else
    {
        Console.WriteLine(NotFound);
    }
}
除了看起来比

一个非常长的switch语句更干净之外,无论分组得多么好,如果你想让它可配置,它都有允许你从一些数据源(例如Web服务,XML文件,数据库)加载字典查找的美妙之处 - 尝试使用switch语句来做到这一点!从长远来看,维护也会更简单 - 只需在字典中添加另一个条目,而不是添加另一个 case 语句。

你不能为一个switch语句指定两个变量,但如果允许你使用DictionaryLINQ,你可以像这样简化你的代码:

var dictionary = new Dictionary<char, int>
        {
            {'A', 2},
            {'B', 2},
            {'C', 2},
            {'D', 3},
            {'E', 3},
            {'F', 3},
            {'G', 3},
            {'H', 3},
            {'I', 3},
            {'J', 3},
            {'K', 3},
            {'L', 3},
            {'M', 3},
            {'N', 3},
            {'O', 3},
            {'P', 3},
            {'Q', 3},
            {'R', 3},
            {'S', 3},
            {'T', 3},
            {'U', 3},
            {'V', 3},
            {'W', 3},
            {'Y', 3},
            {'Z', 3},
        };
var output = string.Concat(new[] {ch1, ch2, ch3, ch4, ch5, ch6, ch7}
            .Select(x => dictionary.ContainsKey(x) ? dictionary[x] : char.MaxValue)
            .Where(x => x != char.MaxValue));
Console.WriteLine(output);

您可以将所有 ch* 变量放入一个列表(或数组)中,并使用 for 循环遍历每个变量。

List<char> chars = new List<char>() { ch1, ch2, ch3, ... };
foreach (var ch in chars)
{
    switch (ch)
    // Your code from here ...
}