在计算符号和两个数字的答案时,我怎么能使用linq

Bro*_*Cow 4 c# linq

最近我接受了一次采访,要求写一个方法来计算前缀格式化字符串的答案.

采访的反馈是我应该使用Linq

我有点困惑,我应该使用linq,并想知道是否有人可以帮助我.

问题

签名方法应该是:

int Calculate(string expression)
Run Code Online (Sandbox Code Playgroud)

我不需要验证输入,但给出了一些例子

  • "+ 3 4"应该给7
  • " - 2 10"应该给-8
  • "*10 -20"应该给-200
  • "/ 6 2"应该给3

我的解决方案 - 来自记忆

所以我创建了单元测试并在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)

Jer*_*ert 8

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以某种方式分割字符串.)

  • 很好的一个,怀疑一个人可以更加"LINQify"它在这个例子中. (2认同)
  • @BrownCow:你是完全正确的,你的代码更具可读性,我会更乐意在生产中遇到它(因为它很明显它的作用和不做的事情,这不能说是我的码).你不需要为这次特别采访"冒昧"感到难过. (2认同)

sch*_*nzo 5

也许他们想看到这样的东西(但我喜欢你的回答;-))

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)