البرمجة

دالة C# العميقة لجمع قيم الأطفال في هيكل البيانات

لفهم المطلوب، نحتاج إلى تحليل الهيكل الهرمي للكتل وكيفية استرجاع القيم من الأب وجميع أبنائه وأبناء أبنائه.

في هذا السياق، يمكننا استخدام الاستدعاء العميق (Recursion) في لغة البرمجة C# لإنشاء دالة تقوم بالمهمة المطلوبة. سنقوم بتمرير معرف الكتلة كمعامل للدالة، وسنقوم بالبحث عن هذه الكتلة وجميع أبنائها وأبناء أبنائها بشكل تكراري.

الآلية التقريبية لهذه الدالة تكون كالتالي:

  1. نبدأ بالبحث عن الكتلة التي يتم تمريرها كمعرف.
  2. نجمع قيمة هذه الكتلة.
  3. ثم نقوم بالبحث عن جميع الأطفال لهذه الكتلة وجمع قيمهم.
  4. نقوم بتكرار هذه الخطوات لجميع الأطفال.

هناك بعض النقاط التي يجب مراعاتها:

  • يجب التحقق من وجود أطفال قبل بدء جمع قيمهم.
  • يجب التأكد من عدم تكرار زيارة الكتل بواسطة استخدام تعقب الزيارة (visited flag) لكل كتلة.
  • يجب التحقق من عدم دخول في دوامة لانتهاء الاستدعاء العميق.

سنقوم بتطبيق هذه الخطوات في الكود التالي:

csharp
using System; using System.Collections.Generic; using System.Linq; class Block { public int Id { get; set; } public int? ParentId { get; set; } public string Name { get; set; } public decimal Value { get; set; } } class Program { static List blocks; static decimal SumAll(int parentId) { decimal sum = 0; // Find blocks with parentId var children = blocks.Where(b => b.ParentId == parentId).ToList(); // Sum the values of children and their descendants recursively foreach (var child in children) { sum += child.Value + SumAll(child.Id); } return sum; } static void Main(string[] args) { // Sample blocks data var block1 = new Block { Id = 1, ParentId = null, Name = "block 1", Value = 11.34M }; var block11 = new Block { Id = 11, ParentId = 1, Name = "block 11", Value = 234.34M }; var block111 = new Block { Id = 111, ParentId = 11, Name = "block 111", Value = 111 }; var block12 = new Block { Id = 12, ParentId = 1, Name = "block 12", Value = 564 }; var block13 = new Block { Id = 13, ParentId = 1, Name = "block 13", Value = 342.23M }; var block131 = new Block { Id = 131, ParentId = 13, Name = "block 131", Value = 945 }; var block132 = new Block { Id = 132, ParentId = 13, Name = "block 132", Value = 10M }; var block133 = new Block { Id = 133, ParentId = 13, Name = "block 133", Value = 88M }; var block1331 = new Block { Id = 1331, ParentId = 133, Name = "block 1331", Value = 45 }; var block2 = new Block { Id = 2, ParentId = null, Name = "block 2", Value = 234 }; var block3 = new Block { Id = 3, ParentId = null, Name = "block 3", Value = 1249.34M }; // Populate the list of blocks blocks = new List { block1, block11, block111, block12, block13, block131, block132, block133, block1331, block2, block3 }; // Calculate the sum for parent with Id 1 decimal sum = SumAll(1); Console.WriteLine(sum); } }

هذا الكود سيقوم بجمع القيم للأب وجميع أطفاله وأطفال أطفاله بشكل تكراري باستخدام الاستدعاء العميق. يمكنك استبدال القيم في القائمة blocks بالبيانات الخاصة بك لاختبار الكود.

المزيد من المعلومات

بالطبع، يمكننا توسيع المعلومات لتشمل بعض النقاط الإضافية حول الدالة العاملة وكيفية تحسينها وتوسيع نطاق استخدامها:

  1. التحقق من وجود الأطفال: قبل البدء في جمع قيم الأطفال، يمكن إضافة شرط للتحقق مما إذا كانت هناك أطفال للكتلة المحددة أم لا. في حالة عدم وجود أطفال، يمكننا تجاوز الخطوة لتوفير الوقت والأداء.

  2. تعقب الزيارة: من المهم تتبع الكتل التي تم زيارتها بالفعل لتجنب الدخول في حلقة لانهائية في حالة وجود روابط دائرية في البيانات. يمكن استخدام مجموعة مؤشرات للتحقق من الكتل التي تمت زيارتها بالفعل.

  3. التحسينات في الأداء: قد يكون هناك فرص لتحسين أداء الدالة عن طريق استخدام تقنيات التحسين مثل التخزين المؤقت (caching) للقيم أو استخدام الحد الأقصى للتراكم (accumulation threshold) لتجنب الاستدعاء العميق للكتل الصغيرة.

  4. معالجة الأخطاء: يمكن إضافة تحقق من الأخطاء والتعامل معها في حالة وجود بيانات غير صالحة أو مفقودة، مثل تحقق الكتلة المطلوبة قبل البدء في الاستدعاء العميق.

  5. استخدام LINQ: يمكن استخدام تعبيرات LINQ لتبسيط الكود وزيادة قابليته للقراءة. على سبيل المثال، يمكن استخدام تعبير LINQ لتصفية الكتل بناءً على parentId مباشرة دون الحاجة إلى استخدام foreach loop.

  6. توسيع الوظائف: بالإضافة إلى جمع القيم، يمكن توسيع وظائف الدالة لتنفيذ مهام أخرى مثل البحث عن أطفال محددين أو حساب العدد الكلي للأطفال.

تطوير الدالة لتشمل هذه النقاط يمكن أن يحسن من كفاءتها وقابليتها للاستخدام في مجموعة متنوعة من السيناريوهات.

زر الذهاب إلى الأعلى