質問

   class Foo
   {
       public List<float> Data { get ; set ; }  // list of numbers
       private float Total { get ; set ; } // Contains sum of numbers in Data

       // Constructors and other stuff.
   }

このクラスを使用する私のコードは Data を変更し続けるので、 Total の関連する変更も確認したい。

Data を変更するコードに Total を再計算する関数を追加したくありません。

例:

   Foo f = new Foo(); // Total = 0 
   f.Data.Add(10);    // Total = 10
   f.Data.Add(30);    // Total = 40
   f[1] = 40;         // Total = 50
   // etc

では、この問題の解決策は何ですか?

役に立ちましたか?

解決

代わりに動的に合計を返す関数を取得します(linqを使用するのが最も簡単です):

private float Total
{
   get
   {
      return Data.Sum();
   }
}

実際にはセットアクセサは不要です。

他のヒント

ここには問題はありません。 Total getter は、呼び出されたときにリストの合計を動的に計算できます。これにより、リストはまったく変更されません。ただし、合計の setter の実装方法がわかりません...

  private float Total { // Contains sum of numbers in Data
    get {
      float total = 0;
      foreach (float value in Data) {
        total += value;
      }
      return total;
    }
  }

データを公開しています。データはいつでも消去できます。次のことをお勧めします:

class Foo
{
    private List<float> _data = new List<float>();
    public float Total {get; private set;}
    public void Add(float f) { _data.Add(f); Total += f; }
}

Totalゲッターに計算ロジックを追加します:

private float Total
{
  get { return CalculateResult(Data) };
}

この方法では、セッターも必要ありません。もちろんキャッシュできます:データリストを変更すると変更されるクラスにダーティフラグを導入します。次に、Total getterで取得した計算結果をローカルクラスフィールドにキャッシュし、ダーティフラグが設定されていない場合は再利用します(再計算時にクリアします)。

totalプロパティにはセッターは必要ないと思いますが、ゲッターは呼び出しごとに合計を再計算するだけです

class Foo
   {
       public List<float> Data { get ; set ; }  // list of numbers
       private float Total { get{return Data.Sum()} ; } // Contains sum of numbers in Data


   }

Total のセッターが必要な理由最良の方法は、Totalが自動計算されるプロパティを作成し、Totalのゲッター値を動的に計算することです。

または...プライベートフィールド data および total を導入し、 Data セッター内で total を再計算できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top