下一个例子:
用户输入样本:“1 + 3 - 2 * 4”
string input = Console.ReadLine();
string[] getElement = input.split(' ');
//So I can have
//getElement[0] = 1
//getElement[1] = +
//getElement[2] = 3
//...
//I have a "for()" cicle here and at one moment I have the following instruction:
if(getElement[i] == "+")
int add = Convert.ToInt32(getElement[i - 1]) + Convert.ToInt32(getElement[i + 1]);
//In this example it means: add = 1 + 3
我的问题是如何删除1>} [0],[1],[2]
getElement的string[]
位置并将其替换为“添加”值?
在这种情况下,我不知道如何使用Replace()
。我应该调整阵列大小吗?需要建议。
答案 0 :(得分:2)
您可以使用List<string>
代替数组。您可以像在阵列中一样处理列表中的各个部分,并且可以删除项目。
请确保您测试getElement[i - 1]
或getElement[i + 1]
不会首先生成IndexOutOfRangeException
...
注意:对于非常简单的操作,例如示例中的操作,这是一种合理的方法,但对于任何更复杂的操作 - 例如支持括号或函数 - 您需要基于a实现适当的解析器语法。您可以使用Gold Parsing System构建这样的解析器(请参阅http://www.goldparser.org)。
答案 1 :(得分:1)
试试这样:
string input = Console.ReadLine();
string[] getElement = input.split(' ');
if(getElement[i] == "+")
{
int add = Convert.ToInt32(getElement[i - 1]) + Convert.ToInt32(getElement[i + 1]);
input = input.Replace(getElement[i - 1] + ' ' + getElement[i] + ' ' + getElement[i + 1]),add.ToString())
}
这将从输入表达式中删除所有1+3
,并将其替换为add
变量下存储的新值。
请务必按照其他专家的建议处理indexOutOfRangeException
。
答案 2 :(得分:0)
你可以用
完成input.Replace(string.Concat(element[0],element[1],element[2]),"Result")
答案 3 :(得分:0)
不要使用数组,使用列表。您无法删除元素并将其添加到数组中,但您可以在列表中执行此操作。
List<String> myList = new List<String>();
myList.add("something");
myList.removeAt(0);
答案 4 :(得分:0)
要有效解决此问题,您需要使用Shunting-yard Algorithm将表达式转换为Reverse Polish Notation表示形式。这样,您将遵守BODMAS操作顺序并最终获得正确的结果。
执行操作,因为它们被解析似乎很容易,但是会在任何非常复杂的测试用例中反击。即每当操作数出现在操作顺序之外时。 e.g。
3 - 2 + 4 * 2 /(2 ^ 2 + 3)