Domanda

   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.
   }

Il mio codice che utilizza questa classe continua a modificare Data , quindi voglio vedere anche le modifiche rilevanti in Total .

Non voglio aggiungere una funzione che ricalcola Total al codice che modifica Data .

Esempio:

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

Quindi qual è la soluzione a questo problema?

È stato utile?

Soluzione

Modifica invece la funzione per restituire dinamicamente il totale (usare linq è più semplice):

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

In realtà non è necessario un set di strumenti di accesso.

Altri suggerimenti

Non vedo il problema qui. Il Total getter può calcolare dinamicamente il totale dell'elenco quando viene chiamato, il che non modifica affatto l'elenco. Tuttavia, non vedo come desideri implementare un setter per il totale ...

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

Stai esponendo i Dati, potrebbero essere cancellati in qualsiasi momento, ti suggerirei quanto segue:

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

Aggiungi logica di calcolo al getter totale:

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

In questo modo non hai nemmeno bisogno di setter. Naturalmente è possibile memorizzare nella cache: introdurre il flag sporco in una classe che viene modificata quando si cambia l'elenco dei dati. Quindi, ottieni il risultato del calcolo della cache che ottieni in Total getter in un campo di classe locale e riutilizzalo se il flag sporco non è impostato (cancellalo al ricalcolo).

Penso che non sia necessario il setter nella proprietà totale, tuttavia il getter ricalcola semplicemente la somma per ogni chiamata

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


   }

Perché hai bisogno di settare su Total ? Il modo migliore è rendere la proprietà calcolata automaticamente di Total e calcolare dinamicamente il valore getter del Total.

Oppure ... puoi introdurre campi privati ?? data e total e ricalcolare total nel setter Data .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top