突然想到两个问题,请高手帮忙解答下哈
1 有个string叫"aa",有个变量名字也叫aa,有办法把这个string转为以它为名字的变量吗.
2 可能是编译原理里的一个问题,有段string "3*2/5+x",(x表示一个变量),如何把这个string解析成一段算术式呢?
非常感谢
1 有个string叫"aa",有个变量名字也叫aa,有办法把这个string转为以它为名字的变量吗.
2 可能是编译原理里的一个问题,有段string "3*2/5+x",(x表示一个变量),如何把这个string解析成一段算术式呢?
非常感谢
将,表达式string 转化为string[]使每个元素对应一个字符,
然后分别加以解析.解析也许可以采用,正则表达式来判断当前的元素特征,然后根据这种特征来处理
该是int的是int 该是运算符的转化为运算符...但具体杂整,我还是不知道.
对于第二个问题,这个确实是一个方法,但是我觉得如果算术表达式比较复杂,这个转换的过程就可能非常烦琐....
第一个问题应该怎么实现呢?可能两者还是有点联系的....
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 有点类似.
但是第一个方法不是最理想哦,因为有可能这个变量是动态的生成的,可能没办法事先定义这样的对应.谁知道是否可以用reflect来实现这个呢?
老大们解答下吧....
{
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^
这个方法里的GetFields正好可以解决第一个问题,非常感谢shinaterry啊.
时间一到就double分数哈
^^