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;
好的,这是一个家庭作业,所以绝对要求你使用开关而不是字典。 这很好,你需要学习语法和概念,但是......
我认为还有其他一些应该解决的问题,一些比语法更基本的东西——这就是最少工作的原则。 任何大小的程序都被分解为多个部分、方法、子、函数、对象、例程、模块等。
每个部分都应该做尽可能多的工作,以便完成该部分需要做的事情。 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语句指定两个变量,但如果允许你使用Dictionary
和LINQ
,你可以像这样简化你的代码:
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 ...
}