سؤال

   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 getter يمكنه حساب إجمالي القائمة ديناميكيًا عند استدعائها، وهو ما لا يعدل القائمة على الإطلاق.ومع ذلك، لا أرى كيف تريد تنفيذ واضعة للمجموع...

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

أضف منطق الحساب إلى الإجمالي:

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؟أفضل طريقة هي إجراء حساب إجمالي للخاصية تلقائيًا وحساب قيمة حاصل الإجمالي ديناميكيًا.

أو...يمكنك إدخال الحقول الخاصة data و total وإعادة الحساب total داخل Data واضعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top