Pregunta

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

Mi código que utiliza esta clase sigue modificando Data , por lo que también quiero ver los cambios relevantes en Total .

No quiero agregar la función que recalcula Total al código que modifica Data .

Ejemplo :

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

Entonces, ¿cuál es la solución a este problema?

¿Fue útil?

Solución

Cambie la función para que devuelva dinámicamente el total en su lugar (usar linq es más fácil):

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

En realidad, no es necesario un set de acceso.

Otros consejos

No veo el problema aquí. El Total getter puede calcular el total de la lista dinámicamente cuando se llama, lo que no modifica la lista en absoluto. Sin embargo, no veo cómo desea implementar un setter para el total ...

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

Está exponiendo los datos, todos podrían borrarse en cualquier momento, sugeriría lo siguiente:

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

Agregar lógica de cálculo al total getter:

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

De esta manera ni siquiera necesitas setter. Por supuesto, puede almacenar en caché: introduzca el indicador sucio en una clase que se cambia cuando cambia la lista de datos. Luego, el resultado del cálculo de caché que obtienes en Total getter a un campo de clase local y reutilizarlo si no se establece un indicador sucio (desactívalo al recalcular).

Creo que no hay necesidad de que el establecedor en la propiedad total, sin embargo, el captador simplemente recalcula la suma para cada llamada

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


   }

¿Por qué necesita un configurador en Total ? La mejor manera es hacer que la propiedad Total calculada automáticamente y calcular el valor de captador del Total dinámicamente.

O ... puede introducir campos privados data y total y recalcular total dentro del Data .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top