Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数组中的元素(从字典值复制时)是反向的_C#_Expressionengine - Fatal编程技术网

C# 数组中的元素(从字典值复制时)是反向的

C# 数组中的元素(从字典值复制时)是反向的,c#,expressionengine,C#,Expressionengine,我的目标是用c#制作一个数学表达式解释器,例如,如果你键入“a=3”,它将把a保存为字典键,把3保存为它的值,这个程序有更多的功能,因此如果你键入“B=3”,然后键入“a=B+3”,然后键入“Show(a)”,它必须显示“6”作为答案 在我输入“A=10”、“B=10”、“C=A+B”和最后的“Show(C)”之前,一切都是正确的,因为变量的值是两位数(或更多)的数字。在这种情况下,当生成最终结果时,数字被保存在字符串中,比如“01+01”,而不是“10+10”(因为A和B的值是10,所以A+B

我的目标是用c#制作一个数学表达式解释器,例如,如果你键入“a=3”,它将把a保存为字典键,把3保存为它的值,这个程序有更多的功能,因此如果你键入“B=3”,然后键入“a=B+3”,然后键入“Show(a)”,它必须显示“6”作为答案

在我输入“A=10”、“B=10”、“C=A+B”和最后的“Show(C)”之前,一切都是正确的,因为变量的值是两位数(或更多)的数字。在这种情况下,当生成最终结果时,数字被保存在字符串中,比如“01+01”,而不是“10+10”(因为A和B的值是10,所以A+B应该是10+10),所以有点颠倒

我尝试反转字符串,然后计算答案,但效果不太好,只是出于某种原因,它给了我“1+1”

注:

  • 表达式计算通过“返回Convert.ToInt32(newdatatable().Compute(result,null));”完成

  • 因为字符串在c#中是不可变的,当每个表达式(如“A+B”或“3+5”)出现在方法中时,我会创建一个新的空字符串(如(string result=“”),然后在“result=ValidExpression[I]+result.Remove(counter,0);”的帮助下,用值更改变量(注意=如果输入的所有元素都是数字,答案是正确的)像“A”和“23”一样,将它们放入新字符串中,然后计算最终字符串。但正如我所说的,它将23保存为32,因此答案将是错误的

  • 这是我的代码,错误可能在LongProcessing方法中。 谢谢你的帮助

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Globalization;
    using System.Data;
    
    namespace ConsoleApp2
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Welcome To The Program\nCorrect Syntax:");
                Console.WriteLine("A=10\nB=15\nC=A+B\nD=13/4-2+A-C+B\nShow(D)");
                Console.WriteLine("\nEnter your input:");
    
                Expression E = new Expression();
                string expression = "start";
                while (expression != "exit")
                {
                    expression = Console.ReadLine();
                    // for show command
                    if (expression.Contains("Show") == true)
                        try { E.Show(expression[5]); }
                        catch (Exception e)
                        {
                            Console.WriteLine("input is not correct, Can not show anything. please try again");
                        }
    
                    if (E.Validation(expression) == false)
                        Console.WriteLine("input is not correct, please try again");
                    else
                        E.Processing(expression);
                }
                Console.ReadKey();
            }
        }
    
        class Expression
        {
            public Dictionary<Char, String> Variables = new Dictionary<Char, String>();
            public Expression()
            { }
    
            public Boolean Validation(string expression)
            {
                // true if c is a letter or a decimal digit; otherwise, false  &&  true if c is a decimal digit; otherwise, false.
                if (!Char.IsLetterOrDigit(expression[0]) || Char.IsDigit(expression[0]))
                    return false;
                else
                    return true;
            }
    
            public void Processing(String ValidExpression)
            {
                // Update Dictionary with new values per key
                if (Variables.ContainsKey(ValidExpression[0]))
                    Variables.Remove(ValidExpression[0]);
    
                string temp = "                ";
                if (ValidExpression.Length > 2 && !ValidExpression.Contains("Show") && !ValidExpression.Contains("exit"))
                {
                    // removing the variable name and "=" from the string
                    for (int i = 2; i < ValidExpression.Length; i++)
                        temp = ValidExpression[i] + temp.Remove(i, 0);
    
                    Variables.Add(ValidExpression[0], LongProcessing(temp).ToString());
                }
            }
             
            // something is wrong in this method
            public int LongProcessing(String ValidExpression)
            {
                string temp;
                int counter = 0;
                string result = "                   ";
                for (int i = 0; i < ValidExpression.Length; i++)
                {
                    //changing variables (letters) with values
                    if (Char.IsLetter(ValidExpression[i]))
                    {
                        if (Variables.ContainsKey(ValidExpression[i]))
                        {
                            Variables.TryGetValue(ValidExpression[i], out temp);
                            for (int j = 0; j < temp.Length; j++)
                            {
                                result = temp[j] + result.Remove(counter, 0);
                                counter++;
                            }
                        }
                    }
                    else
                    {
                        result = ValidExpression[i] + result.Remove(counter, 0);
                        counter++;
                    }
                }
                // checks if all of the string elements are numbers
                if (ValidExpression.All(char.IsDigit))
                    return Convert.ToInt32(ValidExpression);
                else
                {
                    return Convert.ToInt32(new DataTable().Compute(result, null));
                }
            }
            
            public void Show(Char ValidExpression)
            {
    
                Console.WriteLine(Variables[ValidExpression]);
            }
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用System.Linq;
    利用制度全球化;
    使用系统数据;
    名称空间控制台EApp2
    {
    班级计划
    {
    静态void Main(字符串[]参数)
    {
    Console.WriteLine(“欢迎使用该程序\n更正语法:”);
    Console.WriteLine(“A=10\nB=15\nC=A+B\nD=13/4-2+A-C+B\n显示(D)”;
    Console.WriteLine(\n输入您的输入:);
    表达式E=新表达式();
    字符串表达式=“开始”;
    while(表达式!=“退出”)
    {
    expression=Console.ReadLine();
    //用于显示命令
    if(表达式.Contains(“Show”)==true)
    试试{E.Show(表达式[5]);}
    捕获(例外e)
    {
    Console.WriteLine(“输入不正确,无法显示任何内容。请重试”);
    }
    如果(如验证(表达式)=false)
    Console.WriteLine(“输入不正确,请重试”);
    其他的
    E.加工(表达);
    }
    Console.ReadKey();
    }
    }
    类表达式
    {
    公共字典变量=新字典();
    公众表达()
    { }
    公共布尔验证(字符串表达式)
    {
    //如果c是字母或十进制数字,则为true;否则,如果c是十进制数字,则为false&&true;否则为false。
    if(!Char.isleterOrdigit(表达式[0])| | Char.IsDigit(表达式[0]))
    返回false;
    其他的
    返回true;
    }
    公共作废处理(字符串有效性表示)
    {
    //使用每个键的新值更新字典
    if(Variables.ContainsKey(ValidExpression[0]))
    变量.Remove(ValidExpression[0]);
    字符串temp=“”;
    如果(ValidExpression.Length>2&&!ValidExpression.Contains(“显示”)&&!ValidExpression.Contains(“退出”))
    {
    //从字符串中删除变量名和“=”
    for(int i=2;i
    以下是一些建议:

    首先查看“Processing”中的“temp”值。为了帮助调试,请添加“Console.WriteLine”语句

    public void Processing(String ValidExpression)
    {
        // Update Dictionary with new values per key
        if (Variables.ContainsKey(ValidExpression[0]))
            Variables.Remove(ValidExpression[0]);
    
        string temp = "                ";
        if (ValidExpression.Length > 2 && !ValidExpression.Contains("Show") && !ValidExpression.Contains("exit"))
        {
            // removing the variable name and "=" from the string
            for (int i = 2; i < ValidExpression.Length; i++)
            {
                temp = ValidExpression[i] + temp.Remove(i, 0);
                Console.WriteLine("    temp: " + temp); //added for debugging
            }
                        
    
            Variables.Add(ValidExpression[0], LongProcessing(temp).ToString());
        }
    
    }
    
    公共作废处理(字符串ValidExpression)
    {
    //使用每个键的新值更新字典
    if(Variables.ContainsKey(ValidExpression[0]))
    变量.Remove(ValidExpression[0]);
    字符串temp=“”;
    如果(ValidExpression.Length>2&&!ValidExpression.Contains(“Show”)&&!ValidExpression
    
    for (int i = 2; i < ValidExpression.Length; i++)
      temp = ValidExpression[i] + temp.Remove(i, 0);
    
    Assume ValidExpression is "A=10"
    
    Temp starts out as "                "
    First iteration, temp is "1                " 
    Second iteration, temp is "01                "