Frage

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

Mein Code, der diese Klasse verwendet, hält modifizieren Data so dass ich auch die entsprechenden Änderungen in Total sehen will.

Ich will nicht Funktion hinzuzufügen, die Total auf den Code neu berechnet, die Data modifiziert.

Beispiel:

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

Was ist also die Lösung für dieses Problem?

War es hilfreich?

Lösung

Ändern Sie Funktion erhalten, um dynamisch die Total Return statt (mit Linq ist am einfachsten):

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

Keine Notwendigkeit für einen Satz Accessor wirklich.

Andere Tipps

Ich sehe das Problem nicht hier. Die Total Getter die Summe der Liste berechnen kann dynamisch, wenn es aufgerufen wird, die die Liste überhaupt nicht ändern. Aber ich sehe nicht, wie Sie eine Setter implementieren möchten für den gesamten ...

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

Sie haben die Daten auszusetzen, alles jederzeit gelöscht werden könnte, würde ich vorschlagen, die folgende:

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

In Berechnungslogik auf die Gesamt Getter:

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

Auf diese Weise können nicht einmal Setter brauchen. Natürlich können Sie Cache: Dirty-Flag in einer Klasse einführen, die geändert wird, wenn Sie Datenliste ändern. Dann Cache Berechnungsergebnis, das Sie in Total Getter zu einem lokalen Klassenfeld erhalten und wiederverwenden, wenn Dirty-Flag nicht gesetzt ist (klar auf Neuberechnung).

Ich denke, es gibt keine Notwendigkeit für die Setter in der gesamten Eigenschaft ist jedoch der Getter einfach neu berechnet die Summe für jeden Anruf

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


   }

Warum brauchen Sie auf Total Setter? Der beste Weg ist, um Gesamt Auto-berechnete Eigenschaft zu machen und die Getter Wert dynamisch Total zu berechnen.

oder ... können Sie private Felder data und total und neu berechnen total innerhalb Data Setter einzuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top