我是新来的,但不时或多或少地在论坛上走来走去。
我在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;
答案 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语句指定两个变量,但如果您允许使用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);
答案 3 :(得分:-1)
您可以将所有ch *变量放入列表(或数组)中,并使用for循环遍历每个变量。
List<char> chars = new List<char>() { ch1, ch2, ch3, ... };
foreach (var ch in chars)
{
switch (ch)
// Your code from here ...
}