C# 如何使用文本文件中的公式?

C# 如何使用文本文件中的公式?,c#,winforms,text-files,formula,type-conversion,C#,Winforms,Text Files,Formula,Type Conversion,我有一个桌面c#应用程序,它使用公式根据用户的输入计算值 我想知道是否有一种方法可以从文本文件中获取公式并使用它,而不是将其硬编码,这样在编译程序后就可以很容易地更改公式 问题是将此字符串从文本文件转换为代码中可用的公式 谢谢是的,这是个好主意。但如果从文本文件中获取数据类型,则会出现问题。你也需要很好的验证 根据我的建议,您必须使用XML来实现这一点 它很容易处理,而且您可以在比较文本文件时选择更精确的数据,我认为您不能按照您的方法动态使用公式。我并不是说这是不可能的,但让它成为可能将需要在你

我有一个桌面c#应用程序,它使用公式根据用户的输入计算值

我想知道是否有一种方法可以从文本文件中获取公式并使用它,而不是将其硬编码,这样在编译程序后就可以很容易地更改公式

问题是将此字符串从文本文件转换为代码中可用的公式


谢谢

是的,这是个好主意。但如果从文本文件中获取数据类型,则会出现问题。你也需要很好的验证

根据我的建议,您必须使用XML来实现这一点


它很容易处理,而且您可以在比较文本文件时选择更精确的数据,我认为您不能按照您的方法动态使用公式。我并不是说这是不可能的,但让它成为可能将需要在你的应用程序中添加更多额外的填充物

举个简单的例子

您的文本文件包含以下格式的几个简单公式:

Add : a+b
Simple Interest : (P*R*T)/100
Progression = 1+2+3... n+ (n+1)+(n+2)....
那么,你能告诉我,在上面的例子中,你将如何选择公式的动态部分,即
p,R,T,n,a,b

好吧,如果你把你的公式放在代码里就很容易了。是的,你可以做一件普通的事。创建一个类文件,它将包含程序所需的所有公式作为方法的通用方法,并在需要时调用它们

见下文

public static class MathematicalBench
{
    public static double SimpleInterest(double principal, double rate, double time)
    {
       return (principal*rate*time)/100;
    }
}
现在需要的话就打电话

Class A:
    private void SomeMethod1()
    {
       // Your logic 
       var interest=  MathematicalBench.SimpleInterest(128765.98,3.6,16);
    }

Another Class B:
    private void SomeNewMethod1()
    {
       // Your logic 
       var interest=  MathematicalBench.SimpleInterest(6523898,6.2,10);
    }

当然,这将更加灵活和简单。

我认为您可能希望尝试直接解析公式字符串以计算出结果。但是,使用
XML
存储公式也是一个好主意(尽管您必须键入从实际公式转换而来的公式,但要做到这一点,您必须了解一些用于表示公式的XML结构。别担心,它很简单)。首先,我讲一点表示公式的XML结构。它有两种类型的节点:

  • 操作数节点:此节点有名称
    操作数
    ,有一个名为
    值的属性
    ,并且没有任何子元素。它的
    可以是一个数字或一个变量(占位符),以便您可以在运行时将一些值传递给。示例:

    <operand value="1234"/>
    <operand value="x"/>
    
    //expression of (x + y)
    <add>
      <operand value="x"/>
      <operand value="y"/>
    </add>
    
  • 下面的XML是公式f(x,y)=(x+y-x/y)*(x-y)/5的示例。此公式要求在运行时计算2个变量

    <mul>
      <sub>
         <add>
            <operand value="x"/>
            <operand value="y"/>
         </add>
         <div>
            <operand value="x"/>
            <operand value="y"/>
         </div>
      </sub>
      <div>
         <sub>
            <operand value="x"/>
            <operand value="y"/>
         </sub>
         <operand value="5"/>
      </div>
    </mul>
    

    您还可以定义一些名为
    的标记来表示公式,并且可以在同一
    xml
    文件中定义许多公式

    有两种方法适合您:1。使用动态代码(有点复杂)2。解析字符串并在运行时生成/计算相应的公式。这些公式中有哪些操作?这有点像windows calculator如何从剪贴板中提取字符串并给出答案。它包含加法、乘法、减法、除法和平方根。这不是真正的动态。我们可以从字符串中构建无限多的公式,但我们不能构建无限多的包装类。@KingKing您如何为这些变量分配数据类型我认为
    公式中的所有数字(从字符串解析后)都应该被视为
    双精度
    甚至
    十进制
    。我们只关心结果。考虑到我希望使用XML,你能给我一个如何使用XML的示例吗?@Marc它很简单,对于简单的计算(仅+-*/),我们有4种类型的节点,例如
    。我们还有一个节点来表示
    括号
    ,比如
    。前面提到的4个节点中的每个节点应该只有2个元素(操作数),每个操作数可以由称为
    的节点表示。我认为解析它可能需要一些while循环或递归方法,解析结果将输出计算结果。
    public class ArgumentInfo
    {
       public string Name { get; set; }
       public double Value { get; set; }
    }
    public double ComputeNode(XElement node, params ArgumentInfo[] args)
    {
            var operands = node.Elements().ToList();
            if (operands.Count == 0)
            {
                if (node.Name != "operand") throw new ArgumentException("XML formula error! Please check it");
                ArgumentInfo o = args.FirstOrDefault(x => x.Name == node.Attribute("value").Value);
                return o == null ? double.Parse(node.Attribute("value").Value) : o.Value;
            }    
            if (operands.Count != 2) throw new ArgumentException("XML formula error! Please check it");    
            var a = ComputeNode(operands[0], args);
            var b = ComputeNode(operands[1], args);
            if (node.Name == "add") return a + b;
            else if (node.Name == "sub") return a - b;
            else if (node.Name == "mul") return a * b;
            else return a / b;            
    }
    public double Compute(string xmlFormula, params ArgumentInfo[] args)
    {
            XDocument doc = XDocument.Parse(xmlFormula);
            return ComputeNode(doc.Root, args);
    }
    public double ComputeFormulaFromPath(string xmlFormulaPath, params ArgumentInfo[] args)
    {
            XDocument doc = XDocument.Load(xmlFormulaPath);
            return ComputeNode(doc.Root, args);
    }
    //Example f(x,y) = (x + y - x/y) * (x-y) / 5 with (x,y) = (10,20)
    var result = ComputeFormulaFromPath(@"E:\yourFormula.xml", new ArgumentInfo {Name = "x", Value = 10}, 
                                                               new ArgumentInfo {Name="y",Value=20});
    //The result is -59