Вопрос

   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 также.

Я не хочу добавлять функцию, которая пересчитывает 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

Так каково же решение этой проблемы?

Это было полезно?

Решение

Вместо этого вы получите функцию для динамического возврата суммы (проще всего использовать linq):

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

На самом деле нет необходимости в наборе аксессуаров.

Другие советы

Я не вижу здесь проблемы.А Total добытчик может динамически вычислять общую сумму списка при его вызове, что вообще не изменяет список.Однако я не понимаю, как вы хотите реализовать сеттер на общую сумму...

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

Вы раскрываете данные, все они могут быть удалены в любой момент, я бы предложил следующее:

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

Добавьте логику расчета в геттер Total:

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

Таким образом, вам даже не понадобится сеттер.Конечно, вы можете кэшировать:введите грязный флаг в класс, который изменяется при изменении списка данных.Затем кешируйте результат вычисления, который вы получаете в Total getter, в поле локального класса и повторно используйте его, если грязный флаг не установлен (очистите его при перерасчете).

Я думаю, что нет необходимости в установщике в общем свойстве, однако геттер просто пересчитывает сумму для каждого вызова.

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


   }

Зачем нужен сеттер Total?Лучший способ — сделать свойство Total автоматически вычисляемым и динамически вычислять значение метода получения Total.

Или...вы можете ввести частные поля data и total и пересчитать total в пределах Data сеттер.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top