如何简化这段代码?
问题描述:
你有一个想法如何简化这个简单的“翻译机制”?如何简化这段代码?
是一个哈希表有用吗?
char translateChar(char strIn)
{
char strOut = '?';
if (strIn == 'A') strOut = '1';
else if (strIn == 'B') strOut = '2';
else if (strIn == 'C') strOut = '3';
else if (strIn == 'D') strOut = '4';
else if (strIn == 'E') strOut = '5';
else if (strIn == 'F') strOut = '6';
else if (strIn == 'G') strOut = '7';
else if (strIn == 'H') strOut = '8';
else if (strIn == 'I') strOut = '9';
else if (strIn == 'J') strOut = '@';
else if (strIn == 'K') strOut = 'A';
else if (strIn == 'L') strOut = 'B';
else if (strIn == 'M') strOut = 'C';
else if (strIn == 'N') strOut = 'D';
else if (strIn == 'O') strOut = 'E';
else if (strIn == 'P') strOut = 'F';
else if (strIn == 'Q') strOut = 'G';
else if (strIn == 'R') strOut = 'H';
else if (strIn == 'S') strOut = 'I';
else if (strIn == 'T') strOut = 'J';
else if (strIn == 'U') strOut = 'K';
else if (strIn == 'V') strOut = 'L';
else if (strIn == 'W') strOut = 'M';
else if (strIn == 'X') strOut = 'N';
else if (strIn == 'Y') strOut = 'O';
else if (strIn == 'Z') strOut = 'P';
else if (strIn == '2') strOut = 'X';
else if (strIn == '1') strOut = 'Y';
else if (strIn == '_') strOut = '_';
return strOut;
}
答
我认为这对你有帮助...
char[] strIN = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '1', '_' };
char[] strOut = { '2', '3', '4', '5', '6', '7', '8', '9', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'X', 'Y', '_' };
char init = 'C';
int index = Array.IndexOf(strIN, init);
char output = strOut[index];
答
创建Dictionary<char,char>
,用你的翻译填充它,然后简单地说:
return (translationDictionary.ContainsKey(strIn))? translationDictionary[strIn] : null
答
你可以使用一个Dictionary<char, char>
这样的:
private Dictionary<char, char> mTranslationMappings = new Dictionary<char, char>();
// ... in .ctor ...
mTranslationMappings.Add('2', 'X');
// ... add other mappings ...
char translateChar(char strIn)
{
return mTranslationMappings[strIn];
}
这可能不是最好的方法,但它是一个解决方案。
答
使用Dictionary<char, char>
将每个strIn
映射到它的strOut
值。您可能希望将该字典设置为在该类的构造函数中初始化的私有字段。
public class MyClass
{
private Dictionary<char, char> dict = new Dictionary<char, char>();
public MyClass()
{
dict.Add('A', '1');
dict.Add('B', '2');
// ... and so on ...
}
public char TranslateChar(char input)
{
char result;
if (dict.TryGetValue(input, out result))
{
return result;
}
return '?';
}
}
用法:
var myClass = new MyClass();
Console.WriteLine(myClass.TranslateChar('A'));
Console.WriteLine(myClass.TranslateChar('@'));
编辑:响应评论,有一个在方式来确定特定值的键没有建造。要做到这一点,你可以用这个方法:
char value = '@';
foreach (var kvp in dict)
{
if (kvp.Value == value)
{
Console.WriteLine("Key found: " + kvp.Key);
break;
}
}
或者,您可以添加一个TryGetKey
扩展方法,模仿TryGetValue
:
public static class MyExtensions
{
public static bool TryGetKey<TKey, TValue>(
this IDictionary<TKey, TValue> dict,
TValue value,
out TKey key)
{
key = default(TKey);
bool isKeyFound = false;
foreach (var kvp in dict)
{
if (EqualityComparer<TValue>.Default.Equals(kvp.Value, value))
{
isKeyFound = true;
key = kvp.Key;
break;
}
}
return isKeyFound;
}
}
TryGetKey
扩展方法用法:
char value = '@';
char keyResult;
if (dict.TryGetKey(value, out keyResult))
{
Console.WriteLine("Key found: " + keyResult);
}
else
{
Console.WriteLine("Key doesn't exist for value: " + value);
}
答
如果您查看函数的输入和输出,您会看到一些清晰的范围:A-I,J,K-Z,2,1和Y.如果在if语句中使用这些范围,则代码将更简单。甚至比使用字典和填充它更小。
答
假设ASCII编码:
char translateChar(char strIn)
{
if (strIn >= 'A' && strIn <= 'I') return strIn - 'A' + '1' ;
if (strIn >= 'J' && strIn <= 'Z') return strIn - 'J' + '@' ;
if (strIn == '2') return 'X';
if (strIn == '1') return 'Y';
if (strIn == '_') return '_';
return '?';
}
字典是有用这里肯定。 – 2011-12-21 13:35:44
就我所知,散列表肯定会完成这项工作,但会为您节省一些代码字符。另一方面,每个字符都必须在散列表中进行搜索。这意味着这种方法可能不太干净,但更好的性能(如果你用返回'x'替换strOut ='x'),因为这会取消任何进一步的检查。 – 2011-12-21 13:39:19
http://codereview.stackexchange.com/ – 2011-12-21 14:01:06