私は、次のような宣言があります:私は変数名に文字列を変換する
value3 = convert.To int32(calculate);
を実行する必要が
int value1 =5 , value2 =10 ,value3;
string calculate ="value1 + value2"; // dynamic string
動的変数割り当てを計算するためにすべての可能なあり...
私は、次のような宣言があります:私は変数名に文字列を変換する
value3 = convert.To int32(calculate);
を実行する必要が
int value1 =5 , value2 =10 ,value3;
string calculate ="value1 + value2"; // dynamic string
動的変数割り当てを計算するためにすべての可能なあり...
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.CSharp;
using System.Collections.Generic;
static public class Sample {
static public double eval(string exp, Dictionary<string,string> varlist){
CSharpCodeProvider csCompiler = new CSharpCodeProvider();
CompilerParameters compilerParameters = new CompilerParameters();
compilerParameters.GenerateInMemory = true;
compilerParameters.GenerateExecutable = false;
// compilerParameters.ReferencedAssemblies.Add("System.dll");
string temp =
@"static public class Eval {
static public double calc() {
double exp = $exp;
return exp;
}
}";
string equation = exp;
foreach(var key in varlist.Keys){
equation = equation.Replace(key, varlist[key]);
}
temp = temp.Replace("$exp", equation);
CompilerResults results = csCompiler.CompileAssemblyFromSource(compilerParameters,
new string[1] { temp });
if (results.Errors.Count == 0){
Assembly assembly = results.CompiledAssembly;
MethodInfo calc = assembly.GetType("Eval").GetMethod("calc");
double answer = (double)calc.Invoke(null, null);
return answer;
} else {
Console.WriteLine("expression errors!");
foreach(CompilerError err in results.Errors){
Console.WriteLine(err.ErrorText);
}
return Double.NaN;
}
}
}
class Program {
static void Main(){
double value3 = 3;
double value2 = 2;
double value8 = 8;
double value7 = 7;
double value6 = 6;
string calculate = " value3/value2 * value8/(36 * 840) * value7/ (2.2046 * value6) * value7";
var vars = new Dictionary<string,string>();
vars.Add("value3", value3.ToString("F"));
vars.Add("value2", value2.ToString("F"));
vars.Add("value8", value8.ToString("F"));
vars.Add("value7", value7.ToString("F"));
vars.Add("value6", value6.ToString("F"));
double result = Sample.eval(calculate, vars);
Console.WriteLine("{0:F8}", result);
}
}
それはあるが。最も単純な方法は、単純にcalculate.Repalce( "value1"、value1.ToString())。Replace( "value2"、value2.ToString())を実行し、その中で最も複雑なものが本格的なスクリプト言語である間に解析します。同じ文字列を複数回操作する場合は、StringBuilderを使用できます。
:: EDIT :: この質問は以前に聞かれました。コメントを見てください。
私は value3/value2 * value8のようなオペレータの異なるタイプを持っています/(36 * 840)* value7 /(2.2046 * value6) その文字列を動的に読み取ることによって計算する... –
コードにいくつかの誤りがあります。
解決策は以下のとおりです。
int value1 =5 , value2 =10 ,value3;
string calculate =value1.ToString() + value2.ToString(); // dynamic string
value3 = Convert.ToInt32(calculate);
引用符の内側をvalue1とvalue2を入れたときに、彼らはすべてのコンテンツを持って文句を言わないが、リテラルになるためです。一方、あなたは価値観が必要です。だから、文字列に変換してから、3行目やその他の処理をしてください。
おそらくあなたは、辞書でそれを行う必要があります...この
Dictionary<string, int> d = new Dictionary<string, int>();
d["value1"] = 5;
d["value2"] = 10;
string calculate = "value1 + value2";
string[] parts = string.Split(new[]{" + "}, StringSplitOptions.RemoveEmptyEntries);
int result = 0;
foreach(var part in parts)
{
result += d[part];
}
// Do something with result
yaその単純すぎる計算では単純ですが、私の計算式は ですstring calculate = " value3/value2 * value8/(36 * 840)*値7 /(2.2046 *値6)*値7 " 実際に計算する必要があります double result = convert.Todouble –
のようなものは、こちらをご覧ください:http://stackoverflow.com/questions/333737/c-sharp-evaluating-stringを-342-yield-int-18 – MByD
あなたはなぜあなたが欲しいと思いますか?それはあなたのコードを理解するのが難しくなります。 –
これは答えました[C#の動的変数](http://stackoverflow.com/questions/1282888/dynamic-variable-in-c) –