if("Y<0") 如何变成 if(Y<0) ?

nw3250 2010-11-23 02:50:32
有以下需求:
if("Y<0")
{g=60%;}
if("0≤Y≤100%")
{g=110%;}
if("Y>0 && g≤100%")
{g=90%;}
引号里面都是传过来的字符串,会随时间变化。
上面是字符串,当然运行不了,达不到目的,怎样才能转化成下面的语句?
if(Y<0)
{g=60%;}
if(0≤Y≤100%)
{g=110%;}
if(Y>0 && g≤100%)
{g=90%;}
如果您会的话,占用您一小会时间,帮小弟解答一下,感激不尽!
...全文
611 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
nw3250 2010-11-25
  • 打赏
  • 举报
回复
问题已解决。用的是Microsoft.CSharp
sunzhi523 2010-11-24
  • 打赏
  • 举报
回复
以后多多交流 哦。。。
whrspsoft3723 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 nw3250 的回复:]
有以下需求:
if("Y<0")
{g=60%;}
if("0≤Y≤100%")
{g=110%;}
if("Y>0 && g≤100%")
{g=90%;}
引号里面都是传过来的字符串,会随时间变化。
上面是字符串,当然运行不了,达不到目的,怎样才能转化成下面的语句?
if(Y<0)
{g=60%;}
if(0≤Y≤100%)
{g=110%;}
if(……
[/Quote]

不妨你先把程序中抽象的级别再提高一点。
假定有这么一个function
bool func(y,string sConfiation);

这里边可以实现你那个串中的判断, 返回真或假,
这里边要解析一下,因为只是个简单的关系,很容易解析。

这样的你程序会变为以下形式:


if(func(y,"Y<0")
{g=60%;}
if(func(y,"0≤Y≤100%"))
{g=110%;}
if(func(Y,"Y>0 && g≤100%"))
{g=90%;}

对于最后那个复杂的,如果你觉得难于解析,不妨把参数拆开传入。
试试看。

小D2013 2010-11-24
  • 打赏
  • 举报
回复
条件变化是只要调整xml文件即可
小D2013 2010-11-24
  • 打赏
  • 举报
回复
楼主,写个xml文件怎么样
<conditions>
<condition>
<name>Y<0</name>
<val>60%</val>
</condition>
</conditions>
grasshopperwarbler 2010-11-24
  • 打赏
  • 举报
回复
还是觉得用switch是最好的,如果不行,就写一个新的类,专门用来转化形式如“a<b<b”这样的字符串~大不了就用正则表达式,或者一个一个字母截下来替换~
没有访问权限 2010-11-24
  • 打赏
  • 举报
回复
var engine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
var value = Microsoft.JScript.Eval.JScriptEvaluate("Y < 0", engine);
if(Convert.ToBoolean(value)){
......
}
yeaicc 2010-11-24
  • 打赏
  • 举报
回复
搞定了结贴哈,嘻嘻嘻……
yeaicc 2010-11-24
  • 打赏
  • 举报
回复
C# 是可以动态执行字符串语句的。给你个示例:

using System;
using System.Data;
using System.Configuration;
using System.Text;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;

namespace Eval
{
/// <summary>
/// 本类用来将字符串转为可执行文本并执行
/// 从别处复制,勿随意更改!
/// </summary>
public class Evaluator
{
#region 构造函数
/// <summary>
/// 可执行串的构造函数
/// </summary>
/// <param name="items">
/// 可执行字符串数组
/// </param>
public Evaluator(EvaluatorItem[] items)
{
ConstructEvaluator(items); //调用解析字符串构造函数进行解析
}
/// <summary>
/// 可执行串的构造函数
/// </summary>
/// <param name="returnType">返回值类型</param>
/// <param name="expression">执行表达式</param>
/// <param name="name">执行字符串名称</param>
public Evaluator(Type returnType, string expression, string name)
{
//创建可执行字符串数组
EvaluatorItem[] items = { new EvaluatorItem(returnType, expression, name) };
ConstructEvaluator(items); //调用解析字符串构造函数进行解析
}
/// <summary>
/// 可执行串的构造函数
/// </summary>
/// <param name="item">可执行字符串项</param>
public Evaluator(EvaluatorItem item)
{
EvaluatorItem[] items = { item };//将可执行字符串项转为可执行字符串项数组
ConstructEvaluator(items); //调用解析字符串构造函数进行解析
}
/// <summary>
/// 解析字符串构造函数
/// </summary>
/// <param name="items">待解析字符串数组</param>
private void ConstructEvaluator(EvaluatorItem[] items)
{
//创建C#编译器实例
ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());
//编译器的传入参数
CompilerParameters cp = new CompilerParameters();

cp.ReferencedAssemblies.Add("system.dll"); //添加程序集 system.dll 的引用
cp.ReferencedAssemblies.Add("system.data.dll"); //添加程序集 system.data.dll 的引用
cp.ReferencedAssemblies.Add("system.xml.dll"); //添加程序集 system.xml.dll 的引用
cp.GenerateExecutable = false; //不生成可执行文件
cp.GenerateInMemory = true; //在内存中运行

StringBuilder code = new StringBuilder(); //创建代码串
/*
* 添加常见且必须的引用字符串
*/
code.Append("using System; \n");
code.Append("using System.Data; \n");
code.Append("using System.Data.SqlClient; \n");
code.Append("using System.Data.OleDb; \n");
code.Append("using System.Xml; \n");

code.Append("namespace EvalGuy { \n"); //生成代码的命名空间为EvalGuy,和本代码一样

code.Append(" public class _Evaluator { \n"); //产生 _Evaluator 类,所有可执行代码均在此类中运行
foreach (EvaluatorItem item in items) //遍历每一个可执行字符串项
{
code.AppendFormat(" public {0} {1}() ", //添加定义公共函数代码
item.ReturnType.Name, //函数返回值为可执行字符串项中定义的返回值类型
item.Name); //函数名称为可执行字符串项中定义的执行字符串名称
code.Append("{ "); //添加函数开始括号
code.AppendFormat("{0}", item.Expression);//添加函数体,返回可执行字符串项中定义的表达式的值
code.Append("}\n"); //添加函数结束括号
}
code.Append("} }"); //添加类结束和命名空间结束括号

//得到编译器实例的返回结果
CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());

if (cr.Errors.HasErrors) //如果有错误
{
StringBuilder error = new StringBuilder(); //创建错误信息字符串
error.Append("编译有错误的表达式: "); //添加错误文本
foreach (CompilerError err in cr.Errors) //遍历每一个出现的编译错误
{
error.AppendFormat("{0}\n", err.ErrorText); //添加进错误文本,每个错误后换行
}
throw new Exception("编译错误: " + error.ToString());//抛出异常
}
Assembly a = cr.CompiledAssembly; //获取编译器实例的程序集
_Compiled = a.CreateInstance("EvalGuy._Evaluator"); //通过程序集查找并声明 EvalGuy._Evaluator 的实例
}
#endregion

#region 公有成员
/// <summary>
/// 执行字符串并返回整型值
/// </summary>
/// <param name="name">执行字符串名称</param>
/// <returns>执行结果</returns>
public int EvaluateInt(string name)
{
return (int)Evaluate(name);
}
/// <summary>
/// 执行字符串并返回字符串型值
/// </summary>
/// <param name="name">执行字符串名称</param>
/// <returns>执行结果</returns>
public string EvaluateString(string name)
{
return (string)Evaluate(name);
}
/// <summary>
/// 执行字符串并返回布尔型值
/// </summary>
/// <param name="name">执行字符串名称</param>
/// <returns>执行结果</returns>
public bool EvaluateBool(string name)
{
return (bool)Evaluate(name);
}
/// <summary>
/// 执行字符串并返 object 型值
/// </summary>
/// <param name="name">执行字符串名称</param>
/// <returns>执行结果</returns>
public object Evaluate(string name)
{
MethodInfo mi = _Compiled.GetType().GetMethod(name);//获取 _Compiled 所属类型中名称为 name 的方法的引用
return mi.Invoke(_Compiled, null); //执行 mi 所引用的方法
}
#endregion

#region 静态成员
/// <summary>
/// 执行表达式并返回整型值
/// </summary>
/// <param name="code">要执行的表达式</param>
/// <returns>运算结果</returns>
static public int EvaluateToInteger(string code)
{
Evaluator eval = new Evaluator(typeof(int), code, staticMethodName);//生成 Evaluator 类的对像
return (int)eval.Evaluate(staticMethodName); //执行并返回整型数据
}
/// <summary>
/// 执行表达式并返回字符串型值
/// </summary>
/// <param name="code">要执行的表达式</param>
/// <returns>运算结果</returns>
static public string EvaluateToString(string code)
{
Evaluator eval = new Evaluator(typeof(string), code, staticMethodName);//生成 Evaluator 类的对像
return (string)eval.Evaluate(staticMethodName); //执行并返回字符串型数据
}
/// <summary>
/// 执行表达式并返回布尔型值
/// </summary>
/// <param name="code">要执行的表达式</param>
/// <returns>运算结果</returns>
static public bool EvaluateToBool(string code)
{
Evaluator eval = new Evaluator(typeof(bool), code, staticMethodName);//生成 Evaluator 类的对像
return (bool)eval.Evaluate(staticMethodName); //执行并返回布尔型数据
}
/// <summary>
/// 执行表达式并返回 object 型值
/// </summary>
/// <param name="code">要执行的表达式</param>
/// <returns>运算结果</returns>
static public object EvaluateToObject(string code)
{
Evaluator eval = new Evaluator(typeof(object), code, staticMethodName);//生成 Evaluator 类的对像
return eval.Evaluate(staticMethodName); //执行并返回 object 型数据
}
#endregion

#region 私有成员
/// <summary>
/// 静态方法的执行字符串名称
/// </summary>
private const string staticMethodName = "__foo";
/// <summary>
/// 用于动态引用生成的类,执行其内部包含的可执行字符串
/// </summary>
object _Compiled = null;
#endregion
}
/// <summary>
/// 可执行字符串项(即一条可执行字符串)
/// </summary>
public class EvaluatorItem
{
/// <summary>
/// 返回值类型
/// </summary>
public Type ReturnType;
/// <summary>
/// 执行表达式
/// </summary>
public string Expression;
/// <summary>
/// 执行字符串名称
/// </summary>
public string Name;
/// <summary>
/// 可执行字符串项构造函数
/// </summary>
/// <param name="returnType">返回值类型</param>
/// <param name="expression">执行表达式</param>
/// <param name="name">执行字符串名称</param>
public EvaluatorItem(Type returnType, string expression, string name)
{
ReturnType = returnType;
Expression = expression;
Name = name;
}
}
}


使用示例:

textBox1.Text = string.Format("执行结果: {0}", Evaluator.EvaluateToObject(richTextBox1.Text));
ireenter 2010-11-24
  • 打赏
  • 举报
回复
你这个问题可以用CodeDOM来解决,你搜索一下,有很多的文章讲解,就类似与在dotnet内部使用脚本语言一样,你可以动态拼接出来一些语句,然后动态编译并执行它。
zerodegrees 2010-11-24
  • 打赏
  • 举报
回复
关键在于你对问题的理解角度:
举个例子:string str=if("Y<0")
此时你用str.Split();因为"的前面和后面只有是'('和')'。
现在你知道该怎么做了吧。相当于将字符串重构。因为通过左右括号你能获取"的索引。
所以说,解决一个问题往往会有很多变通的方法,从多个角度出发进行思考吧,呵呵!
mengpanfei 2010-11-24
  • 打赏
  • 举报
回复
作为一个程序员,楼主的这个想法就不应该有。哪儿有让用户去“写代码”的!!你还不如去开发个“更易语言”让用户使用呢。

怕用户的需求变动,就把系统配置写成动态的,让用户自定义。
给用户一个设置页面(或窗体),让管理员用户输入“Y<口 则g=60%",口中得到的数值,保存起来,保存在数据库、xml文件、ini、甚至系统注册表中都可以。程序每次启动,都从保存的地方读出来,等待用户输入一个y值进行大小判断。

不要钻现在这个牛角尖了。
小火龙果 2010-11-24
  • 打赏
  • 举报
回复
switch 刚才想复杂了~
小火龙果 2010-11-24
  • 打赏
  • 举报
回复
靠~~这个还真没思路 求高手解答
perrychi 2010-11-23
  • 打赏
  • 举报
回复
LZ是不是字串要提供给使用者输入的条件?譬如使用者可以随意输入"5<Y<8"这样的条件,然后代码可以解析?
yun_feiyang 2010-11-23
  • 打赏
  • 举报
回复
替换应可以吧,把双引号替掉
baysos 2010-11-23
  • 打赏
  • 举报
回复
.Replace("\"","") 这样行不?
None465465535 2010-11-23
  • 打赏
  • 举报
回复
可以通过Microsoft.CSharp里的类来进行动态编译
bb95304164 2010-11-23
  • 打赏
  • 举报
回复
判断字符串里有没有大于号,有没有小于号,有几个,这样行么?
flyerwing 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cj205 的回复:]
这个得分析字符串然后在逻辑判断。
js和python上都可以实现 要不移植过去?
[/Quote]
要不动态编译
加载更多回复(33)
基于强化学习的五子棋强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一。它主要用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。强化学习的特点在于没有监督数据,只有奖励信号。 强化学习的常见模型是标准的马尔可夫决策过程(Markov Decision Process, MDP)。按给定条件,强化学习可分为基于模式的强化学习(model-based RL)和无模式强化学习(model-free RL),以及主动强化学习(active RL)和被动强化学习(passive RL)。强化学习的变体包括逆向强化学习、阶层强化学习和部分可观测系统的强化学习。求解强化学习问题所使用的算法可分为策略搜索算法和值函数(value function)算法两类。 强化学习理论受到行为主义心理学启发,侧重在线学习并试图在探索-利用(exploration-exploitation)间保持平衡。不同于监督学习和非监督学习,强化学习不要求预先给定任何数据,而是通过接收环境对动作的奖励(反馈)获得学习信息并更新模型参数。强化学习问题在信息论、博弈论、自动控制等领域有得到讨论,被用于解释有限理性条件下的平衡态、设计推荐系统和机器人交互系统。一些复杂的强化学习算法在一定程度上具备解决复杂问题的通用智能,可以在围棋和电子游戏中达到人类水平。 强化学习在工程领域的应用也相当广泛。例如,Facebook提出了开源强化学习平台Horizon,该平台利用强化学习来优化大规模生产系统。在医疗保健领域,RL系统能够为患者提供治疗策略,该系统能够利用以往的经验找到最优的策略,而无需生物系统的数学模型等先验信息,这使得基于RL的系统具有更广泛的适用性。 总的来说,强化学习是一种通过智能体与环境交互,以最大化累积奖励为目标的学习过程。它在许多领域都展现出了强大的应用潜力。

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧