Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-作为对象的计算-具有许多依赖关系的许多计算_C#_Excel_Pseudocode - Fatal编程技术网

C#-作为对象的计算-具有许多依赖关系的许多计算

C#-作为对象的计算-具有许多依赖关系的许多计算,c#,excel,pseudocode,C#,Excel,Pseudocode,我用Excel开发了一个相当复杂的电子表格,我的任务是将其转换为C#程序 我想弄清楚的是如何用C#表示电子表格中的计算 这些计算有许多依赖关系,以至于它几乎看起来像一个web,而不是一个漂亮整洁的层次结构 我能想到的设计解决方案是: 创建一个对象来表示每个计算。 每个对象都有一个整数或double,其中包含计算。 此计算包含来自其他对象的输入,因此需要先对其进行计算,然后才能执行 每个对象都有第二个整数“completed”,如果上一次计算成功,则该整数的计算结果为1 每个对象都有第三个整数“

我用Excel开发了一个相当复杂的电子表格,我的任务是将其转换为C#程序

我想弄清楚的是如何用C#表示电子表格中的计算

这些计算有许多依赖关系,以至于它几乎看起来像一个web,而不是一个漂亮整洁的层次结构

我能想到的设计解决方案是:

  • 创建一个对象来表示每个计算。
  • 每个对象都有一个整数或double,其中包含计算。 此计算包含来自其他对象的输入,因此需要先对其进行计算,然后才能执行

  • 每个对象都有第二个整数“completed”,如果上一次计算成功,则该整数的计算结果为1

  • 每个对象都有第三个整数“就绪” 此项要求对所有前置对象的“已完成”整数求值 “1”,如果不是,循环将跳过此对象
  • 一个循环在所有对象中运行,直到所有“已完成”整数=1
我希望这是有道理的。我正在为此输入代码,但我对C语言还是相当熟悉,所以至少知道我的思路是正确的是一件好事:) 澄清一下,这是一个设计查询,我只是想找一个比我更有C#经验的人来验证我的方法是否合理

我感谢您在这个问题上提供的任何帮助,我也很想听听您的想法!:)

编辑*

我认为循环状态检查需要“完成”状态和“准备就绪”状态,以防止在未评估先例的情况下尝试评估计算时可能出现错误。这有必要吗

我将其设置为“任意CPU”,默认设置

编辑*

例如,一个对象将是一条线“V_dist” 作为属性,它具有长度。 它的长度“V_dist.calc_formula”是根据另外两个对象“hpc*Tan(dang)”计算得出的


应该注意的是,我还没有添加的其他功能,比如循环和控制两个布尔属性的逻辑,你有一些好主意,但是如果我理解你想做什么,我认为有一种更惯用的方法——更面向对象的方法来解决这个问题,也不那么复杂。我假设您有一个标准的电子表格,其中电子表格上有许多行实际上都有相同的列。也可能是在电子表格的不同部分有不同的列

我已经将几个电子表格转换为应用程序,我已经确定了这种方法。我想你会喜欢的

对于每一组头,我都将其建模为单个对象类。每列都是类的属性,每行都是一个对象实例

在除了极少数情况之外的所有情况下,我要说的是,只需对属性进行建模,以包含计算。一个简单的盒子示例如下:

public class Box
{
    public double Length { get; set; }
    public double Width { get; set; }
    public double Height { get; set; }

    public double Area
    {
        get { return 2*Height*Width + 2*Length*Height + 2*Length*Width; }
    }

    public double Volume
    {
        get { return Length * Width * Height; }
    }
}
这里的想法是,如果有属性(Excel中的列)使用其他计算属性/列作为输入,只需使用属性本身:

public bool IsHuge
{
    get { return Volume > 50; }
}
.NET将为您处理所有繁重的工作和依赖关系

在大多数情况下,与Excel相比,这将在C#中运行,我认为您不必担心设置级联对象时的计算速度

当我说除了极少数情况之外的所有情况时,如果你有计算上非常昂贵的属性,那么你可以将这些属性私有化,然后触发计算

public class Box
{
    public double Length { get; set; }
    public double Width { get; set; }
    public double Height { get; set; }

    public double Area { get; private set; }
    public double Volume { get; private set; }
    public bool IsHuge { get; private set; }

    public void Calculate()
    {
        Area = 2*Height*Width + 2*Length*Height + 2*Length*Width;
        Volume = Length * Width * Height;
        IsHuge = Volume > 50;
    }
}

在您走这条路之前,我建议您进行性能测试。除非您有数百万行和/或非常复杂的计算,否则我怀疑第二种方法是否值得,并且您不需要定义何时进行计算。只有在访问属性时才会发生这种情况。

您已经清楚地说明了您的代码,并且它似乎是可行的。这是一个设计问题吗?如果这是一个关于设计的问题,您需要详细说明您的设计决策和使用场景。例如,为什么您需要一个状态来检查计算是否完成,是否有人可以在流程计算之前访问数据?这是否在多线程上运行以分发计算?您可以编辑您的问题以澄清您的决定。如果您提供一些计算示例,这会有所帮助。我现在正在编写代码,但计算本身是基本几何/三角。您可能需要将计算表示为字符串。然后在执行计算时解析关键字/运算符/数字的字符串。Excel使用单元格引用来处理其数据的“web”。如果创建“单元格”的二维数组(其中一个单元格包含有关特定计算(如excel)的信息),则可以通过其索引(即A1、1,1或0,0)引用另一个单元格中的一个单元格。我用java做了一个类似的任务,读取excel计算的CSV并处理它们,唯一的技巧是跟踪计算中的循环引用(这里有一组帮助)。
public class Box
{
    public double Length { get; set; }
    public double Width { get; set; }
    public double Height { get; set; }

    public double Area { get; private set; }
    public double Volume { get; private set; }
    public bool IsHuge { get; private set; }

    public void Calculate()
    {
        Area = 2*Height*Width + 2*Length*Height + 2*Length*Width;
        Volume = Length * Width * Height;
        IsHuge = Volume > 50;
    }
}