2009-10-23 48 views
0
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也看到相關的變化。有關getter和setter的C#問題?

我不想添加函數,將Total重新計算爲修改Data的代碼。

例子:

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

那麼什麼是解決這個問題?

回答

2

影響你獲得功能動態返回總代替(使用LINQ是最簡單的):

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

無需set訪問真的。

4

我在這裏沒有看到問題。 Totalgetter可以在被調用時動態地計算列表的總數,它根本不會修改列表。但是,我不看你怎麼想實現一個二傳手總...

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

我不知道。 – 2009-10-23 11:39:45

+0

我覺得他的意思是,他不知道爲什麼要實現一套?爲什麼需要直接設置總值而不修改數據? – badbod99 2009-10-23 12:21:48

4

你暴露的數據,可以全部在任何時間抹去,我建議以下:

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; } 
} 
0

爲什麼在Total上需要setter?最好的方法是使Total自動計算的屬性動態計算Total的getter值。

或者......你可以引入私人領域datatotalData二傳手內重新計算total

1

添加計算邏輯,以總吸氣:

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

這樣,你甚至不需要制定者。當然,您可以緩存:在更改數據列表時更改的類中引入髒標誌。然後,將Total getter中獲得的計算結果緩存到本地類字段,並在未設置髒標誌(在重新計算時將其清除)時重用該計算結果。

1

我覺得沒有必要在總資產的二傳手,但是吸氣簡單地重新計算總和每次調用

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


    }