最近我接受了一次采访,要求写一个方法来计算前缀格式化字符串的答案.
采访的反馈是我应该使用Linq
我有点困惑,我应该使用linq,并想知道是否有人可以帮助我.
问题
签名方法应该是:
int Calculate(string expression)
Run Code Online (Sandbox Code Playgroud)
我不需要验证输入,但给出了一些例子
我的解决方案 - 来自记忆
所以我创建了单元测试并在TDD庄园中开发了代码
[TestFixture]
public class UnitTest1
{
[Test]
public void TestMethod_Add()
{
var calculator = new Calculator();
var result = calculator.Calculate("+ 4 2");
var expected = 6;
Assert.AreEqual(expected, result);
}
[Test]
public void TestMethod_Sub()
{
var calculator = new Calculator();
var result = calculator.Calculate("- 2 10");
var expected = -8;
Assert.AreEqual(expected, result);
}
[Test]
public void TestMethod1_mult()
{
var calculator = new Calculator();
var result = calculator.Calculate("* 10 -20");
var expected = -200;
Assert.AreEqual(expected, result);
}
[Test]
public void TestMethod1_div()
{
var calculator = new Calculator();
var result = calculator.Calculate("/ 6 2");
var expected = 3;
Assert.AreEqual(expected, result);
}
Run Code Online (Sandbox Code Playgroud)
并创建了以下代码:
public class Calculator
{
public int Calculate(string expression)
{
var tokens = expression.Split(' ');
var symbol = tokens[0];
var num1 = int.Parse(tokens[1]);
var num2 = int.Parse(tokens[2]);
switch (symbol)
{
case "+":
return num1 + num2;
case "-":
return num1 - num2;
case "*":
return num1 * num2;
case "/":
return num1 / num2;
default:
throw new NotImplementedException("Symbol has not been implemented");
}
}
}
Run Code Online (Sandbox Code Playgroud)
LINQ就像我可以填充它一样多:
int Calculate(string expression) {
var operations = new Dictionary<char, Func<int, int, int>> {
{ '+', (a, b) => a + b },
{ '-', (a, b) => a - b },
{ '*', (a, b) => a * b },
{ '/', (a, b) => a / b },
};
return expression
.Substring(2)
.Split(' ')
.Select(o => int.Parse(o))
.Aggregate(operations[expression[0]])
;
}
Run Code Online (Sandbox Code Playgroud)
作为额外的奖励,这可以毫不费力地处理诸如"* 1 2 3 4 5"(5!,我们都知道是120)或"/ 1729 7 13 19"(如果你想反向进行你的因子分析)这样的表达式.
这是开玩笑的一半.我不认为这是一个生产中适当的实现Calculate方法,显然只需要处理两个值.如果你的面试官只是在寻找你能做出多么聪明的事情,那么这可能会给你积分.(如果他们只是在寻找你能为聪明的问题做出多么聪明的事情,那就很高兴你没有得到这份工作 - 那家公司的维修可能是件坏事.)
(注意自己:弄清楚一些非常简洁的方法来SelectMany以某种方式分割字符串.)
也许他们想看到这样的东西(但我喜欢你的回答;-))
int Calculate(string expression)
{
char symbol = expression.First();
int[] numbers = Array.ConvertAll(expression.Substring(2).Split(' '), p => int.Parse(p));
switch (symbol)
{
case '+':
return numbers.Aggregate((a, b) => a + b);
case '-':
return numbers.Aggregate((a, b) => a - b);
case '*':
return numbers.Aggregate((a, b) => a * b);
case '/':
return numbers.Aggregate((a, b) => a / b);
default:
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)