Pergunta

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

Meu código que utiliza essa classe mantém modificar Data então eu quero ver as alterações relevantes no Total também.

Eu não quero adicionar a função que Recalcula Total ao código que modifica Data.

Exemplo:

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

Então, qual é a solução para este problema?

Foi útil?

Solução

Alter você começa função retornar dinamicamente o total de vez (usando LINQ é mais fácil):

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

Não há necessidade de um acessor set realmente.

Outras dicas

Não vejo o problema aqui. O Total getter pode calcular o total da lista dinamicamente quando ele está sendo chamado, que não modificar a lista em tudo. No entanto, eu não vejo como você deseja implementar um setter para o total ...

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

Você está expondo os dados, tudo poderia ser apagados a qualquer momento, eu sugiro o seguinte:

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

Adicionar lógica de cálculo para o getter Total:

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

Desta forma, você não precisa mesmo setter. Claro que você pode armazenar em cache: introduzir a bandeira suja em uma classe que é alterado quando altera lista de dados. Em seguida, o resultado do cálculo de cache que você entrar em getter total a um campo de classe local e reutilização que, se a bandeira suja não está definido (limpá-la no recálculo).

Eu acho que não há necessidade para o setter na propriedade totais, no entanto o getter simplesmente recalcular a soma de todas as chamadas

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 que você precisa setter em Total? A melhor maneira é fazer com propriedade total calculado automaticamente e calcular o valor getter do total dinamicamente.

Ou ... você pode introduzir campos data privado e total e total recalcular dentro setter Data.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top