C#中switch语句的多个变量

时间:2014-03-31 00:03:50

标签: c# c#-4.0 switch-statement

我是新来的,但不时或多或少地在论坛上走来走去。

我在c#工作,这是一个家庭作业,但我试图使用switch语句将7个ref字符变量从一个字母转换为相应的数字。我的问题是如何(如果它甚至可能)我可以为一个switch语句使用多个变量。案例将始终相同,我宁愿每个switch语句中有7个语句没有27个案例。老实说,我更愿意做一套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;

4 个答案:

答案 0 :(得分:2)

好的,这是一项家庭作业,因此绝对要求您使用开关而不是字典。没关系,你需要学习语法和概念,但是......

我认为应该解决其他问题,比语法更基本的东西 - 这是最少工作的原则。任何大小的程序都分为几个部分,方法,子程序,功能,对象,例程,模块等。

为了做那件作品需要做的事情,每一件作品都应该做必要的工作。您的ProcessInput函数需要七个参数,然后对所有七个参数执行完全相同的(*三个)事件。

为了有效/可维护地执行此操作,所有代码仍然在一个函数中,您必须添加一个额外的步骤,迭代七个参数。这意味着为了让事情变得更好,你增加了你的功能所做的事情。你已经增加了这件作品所做的工作,但你应该总是努力减少特定作品所做的工作。 "没有更多的东西可以实现完美,但是当没有什么东西可以带走时#34;。你怎么做到这一点?通过添加一个较少的部分,然后将工作委托给该部分。

简而言之,如果您使用现有的ProcessInput函数来获取七个参数,并创建一个采用SINGLE参数的ProcessInput函数,您将获得更多PIECES,但每个部分的工作量都会减少。这意味着如果需求发生变化,这件作品将更容易理解,更易于设计,更易于调试和更容易修改。

此时,您甚至不必进行循环以使过程更容易理解。你可以连续七次调用新函数。

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

我希望你觉得这个答案很有帮助,即使它没有代码。

答案 1 :(得分:0)

如果您需要使用开关声明,那么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);
    }
}

除了看起来比一个非常长的开关语句要干净得多,无论如何组合良好,它还具有允许您从某些数据源(例如webservice,XML文件,数据库)加载字典查找的美妙使其可配置 - 尝试使用switch语句!从长远来看维护也会更简单 - 只需在字典中添加另一个条目,而不是添加另一个案例陈述。

答案 2 :(得分:0)

您无法为一个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);

答案 3 :(得分:-1)

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

List<char> chars = new List<char>() { ch1, ch2, ch3, ... };

foreach (var ch in chars)
{
    switch (ch)
    // Your code from here ...
}