質問
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
を再計算できます。
所属していません StackOverflow