C# 有没有办法简化这个函数?
我有一个函数,它返回一个带有坐标和对象所看方向的字符串。 但是我真的不喜欢函数的长度,我想缩短它。我不知道我能做些什么来缩短它。有人能帮我吗 函数如下所示:C# 有没有办法简化这个函数?,c#,refactoring,simplify,C#,Refactoring,Simplify,我有一个函数,它返回一个带有坐标和对象所看方向的字符串。 但是我真的不喜欢函数的长度,我想缩短它。我不知道我能做些什么来缩短它。有人能帮我吗 函数如下所示: public string Execute(string text) { var letters = text.ToCharArray().ToList(); foreach (var letter in letters) { if (letter == 'R') {
public string Execute(string text)
{
var letters = text.ToCharArray().ToList();
foreach (var letter in letters)
{
if (letter == 'R')
{
switch(direction)
{
case "N":
direction = "E";
break;
case "E":
direction = "S";
break;
case "S":
direction = "W";
break;
case "W":
direction = "N";
break;
}
}
if (letter == 'L')
{
switch (direction)
{
case "N":
direction = "W";
break;
case "E":
direction = "N";
break;
case "S":
direction = "E";
break;
case "W":
direction = "S";
break;
}
}
if (letter == 'M')
{
switch (direction)
{
case "N":
positionY++;
break;
case "E":
positionX++;
break;
case "S":
positionY--;
break;
case "W":
positionX--;
break;
}
}
if (letter == 'B')
{
switch (direction)
{
case "N":
positionY--;
break;
case "E":
positionX--;
break;
case "S":
positionY++;
break;
case "W":
positionX++;
break;
}
}
}
return $"{positionX}:{positionY}:{direction}";
}
下面的文本只是一个无用的文本,因此我可以提交我的问题,因为我的代码太长,Stackoverflow将问题识别为主要代码,因此我必须在没有代码括号的情况下编写更多文本才能提交问题。您不必阅读此文本,因为它没有任何用途。请尝试以下内容:
string text = "";
var letters = text.ToCharArray().ToList();
Dictionary<char, Dictionary<string, string>> dict = new Dictionary<char, Dictionary<string, string>>() {
{'R', new Dictionary<string, string>() { { "N", "E" }, { "E", "S" }, { "S", "W" }, { "W", "N" }}},
{'L', new Dictionary<string, string>() { { "N", "W" }, { "E", "N" }, { "S", "E" }, { "W", "S" }}},
{'M', new Dictionary<string, string>() { { "N", "AY" }, { "E", "AX" }, { "S", "SY" }, { "W", "SX" }}},
{'R', new Dictionary<string, string>() { { "N", "SY" }, { "E", "SX" }, { "N", "AY" }, { "N", "AX" }}}
};
string direction = "";
int positionX = 0;
int positionY = 0;
foreach (var letter in letters)
{
string value = dict[letter][direction];
switch (value)
{
case "SX":
positionX--;
break;
case "SY":
positionY--;
break;
case "AX":
positionX++;
break;
case "AY":
positionY++;
break;
case "N":
direction = value;
break;
case "E":
direction = value;
break;
case "S":
direction = value;
break;
case "W":
direction = value;
break;
}
string text=”“;
var letters=text.ToCharArray().ToList();
Dictionary dict=新字典(){
{'R',新字典(){{“N”,“E”},{“E”,“S”},{“S”,“W”},{“W”,“N”},
{'L',新字典(){{“N”,“W”},{“E”,“N”},{“S”,“E”},{“W”,“S”},
{M',新字典(){{N”,“AY”},{E”,“AX”},{S”,“SY”},{W”,“SX”},
{'R',新字典(){{“N”,“SY”},{“E”,“SX”},{“N”,“AY”},{“N”,“AX”}
};
字符串方向=”;
int位置x=0;
int位置y=0;
foreach(字母中的var字母)
{
字符串值=dict[字母][方向];
开关(值)
{
案例“SX”:
位置X-;
打破
案例“SY”:
位置--;
打破
案例“AX”:
positionX++;
打破
案例“AY”:
positionY++;
打破
案例“N”:
方向=值;
打破
案例“E”:
方向=值;
打破
案例“S”:
方向=值;
打破
案例“W”:
方向=值;
打破
}
查找模式,并找出一种在算法中使用模式的方法。例如,对于R
和L
,它看起来像是直接顺时针或逆时针旋转。您可以编写一个小函数来启用该功能(使用一组方向字符串(您将其环绕)代码在数组中向左或向右移动)。类似地,对于M
和B
,以固定模式将位置偏移+1
或-1
。将该逻辑重构为一个函数,以找出规则。使用旧值作为键,新值作为值的字典。字典lDict=new Dictionary(){{“N”,“W”},{“E”,“N”},{“S”,“E”},{“W”,“S”};dict=lDict[dict];在我看来,这正是正确的方法。虽然这可能是更多的代码行“聪明”解决方案,它是最容易维护和理解的。对于目前为止这里提出的每一个其他解决方案,如果您或其他人以后必须更改它,您将遇到困难。相反,每个人都会立即理解简单的“切换”方法。