突然想到两个问题,请高手帮忙解答下哈
1 有个string叫"aa",有个变量名字也叫aa,有办法把这个string转为以它为名字的变量吗.
2 可能是编译原理里的一个问题,有段string "3*2/5+x",(x表示一个变量),如何把这个string解析成一段算术式呢?
非常感谢

解决方案 »

  1.   

    才十分,我觉得蛮复杂 的,思路:
    将,表达式string 转化为string[]使每个元素对应一个字符,
    然后分别加以解析.解析也许可以采用,正则表达式来判断当前的元素特征,然后根据这种特征来处理
    该是int的是int 该是运算符的转化为运算符...但具体杂整,我还是不知道.
      

  2.   

    多谢ProjectDD哈...实在分数不多了...呵呵...
    对于第二个问题,这个确实是一个方法,但是我觉得如果算术表达式比较复杂,这个转换的过程就可能非常烦琐....
    第一个问题应该怎么实现呢?可能两者还是有点联系的....
      

  3.   

    分好低哦.1. 先做个注册,把变量的对象和名称用hash表联起来.
        Hashtable h = new Hashtable();
        h.Add("aa", aa);   h["aa"]即可指向aa变量.2. 先做字符替换, 比如 x = 9,  "3*2/5+x" 替换后成为 3*2/5+9 ,然后么, 
      javascript:eval('3*2/5+9')  javascript的方法. c#里还没有找到类似的,databingder Eval 有点类似.
      

  4.   

    多谢xxoo2007,js中的eval确实有这个功能,就是不知道.net里有没有对应的方法,可以把string当作表达式的。
    但是第一个方法不是最理想哦,因为有可能这个变量是动态的生成的,可能没办法事先定义这样的对应.谁知道是否可以用reflect来实现这个呢?
      

  5.   

    顺大家意思, 加多点分吧..."我"有办法,.Net可实现...^o^ 哈哈...
      

  6.   

    我倒....好吧,我再开个,double下分数哈......
    老大们解答下吧....
      

  7.   

    参考代码:public static class Dynamic
    {
        public static float Calc(object instance, string expression)
        {
            if (instance == null)
            {
                throw new NullReferenceException();
            }        if (expression == null)
            {
                throw new Exception("无效表达式");
            }        FieldInfo[] variables = instance.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);        Hashtable mapping = new Hashtable();        foreach (FieldInfo var in variables)
            {
                if (var.FieldType.IsValueType)
                {
                    mapping.Add(var.Name, var.GetValue(instance));
                }
            }        string[] result = Regex.Split(expression, @"[+\-*/]{1}", RegexOptions.Singleline);        for (int i = 0; i < result.Length; i++)
            {
                result[i] = result[i].Trim();            if (!Regex.IsMatch(result[i].Substring(0, 1), "[0-9]")) //不以数字开头, 当作变量处理...
                {
                    if (mapping.Contains(result[i]))
                    {
                        expression = expression.Replace(result[i], mapping[result[i]].ToString());
                    }
                }
            }        try
            {
                return Convert.ToSingle(new DataTable().Compute(expression, null));
            }
            catch (Exception error)
            {
                throw error;
            }
        }
    }测试代码:public class _A
    {
        public _A() { }    public int x = 1;
        
        public short y = 2;
    }[STAThread]
    static void Main()
    {
        MessageBox.Show(Dynamic.Calc(new _A(), @"3*2/5+x-y+x").ToString()); //3*2/5+1-2+1 = 1.2    _A _a = new _A();    _a.x = 8;    _a.y = 7;    MessageBox.Show(Dynamic.Calc(_a, @" 3 * 2 / 5 + x - y + x ").ToString()); //3*2/5+8-7+8 = 10.2
    }
    晚上有点时候, 匆忙写上...现在只可以做 "加减乘除"至于性能问题, 自己优化...^o^
      

  8.   

    果然强悍啊,原来dataTable有compute方法相当于js的eval,真是奇怪这个方法为什么要放到DataTable里呢....
    这个方法里的GetFields正好可以解决第一个问题,非常感谢shinaterry啊.
    时间一到就double分数哈
      

  9.   

    大家帮我顶下这个吧http://topic.csdn.net/u/20080110/21/2fb61620-b058-472a-8def-dc3e233823a5.html,这个20分...呵呵
    ^^