3路计算

leo*_*ora 7 c#

我有一个包含三个字段A,B和C的数据对象.问题是用户可以设置其中任何一个,因为:

A*B = C.

因此,如果用户通过设置A和B开始,则将计算C. 但是如果用户设置了C,则会重新计算A,因此会根据用户设置的最后一个字段进行隐式锚定.

我想避免使用大量标志成员变量的解决方案.关于如何编写这门课程的任何最佳实践,而不需要在下面有很多这样的东西

public class Object
{
     private double _A;
     private double _B;
     private double _C;

     private bool _enteredA;
     private bool _enteredB;
     private bool _enteredC;

public double A
{
get
    {
     if (_enteredC)
     {
          return _C / _B;
     }
     else
     {
        return _A;
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果设置A,B和C的逻辑总是在"get"或"set"上.

有没有更清洁的方法来做到这一点?

nic*_*ckf 4

所以你的规则是:

A = C / B
B = C / A
C = A * B
Run Code Online (Sandbox Code Playgroud)

您需要做的是记住用户输入的最后两个字段,然后计算第三个字段。因此,如果他们输入 A,然后输入 B,那么您将计算 C。如果他们随后更改 C,则重新计算 A,依此类推。

如果您想在不使用布尔标志的情况下对其进行编码,可以使用几种不同的方法来实现。一个队列,或者只是一个简单的数组/映射就可以了:

editOrder = {A : 0, B : 0, C : 0 }  // (or just use 0, 1, 2)
editCount = 0;

every time any field is edited :
    editCount = editCount + 1
    editOrder[field] = editCount
    if two fields have an editOrder > 0
        recalculate the field with the lowest editOrder
Run Code Online (Sandbox Code Playgroud)

用法示例:

Field changed    editOrder        recalculate field
    A            1,0,0            -
    A            2,0,0            -
    B            2,3,0            C
    C            2,3,4            A
    C            2,3,5            A
    B            2,6,5            A
    A            7,6,5            C
Run Code Online (Sandbox Code Playgroud)