0Pricing
C# Academy · درس

تحويل النتائج (ToList وToDictionary) وملاحظات الأداء

حوّل الاستعلامات المؤجلة إلى مجموعات ملموسة باستخدام ToList/ToArray/ToDictionary؛ وتجنب التعداد المتكرر، وافهم قواعد تفرد المفاتيح.

تحويل النتائج (ToList وToDictionary) وملاحظات الأداء درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 3 دروس في المجموع.

سبب التجسيد

تُنفَّذ الاستعلامات المؤجلة في كل مرة تعدّها فيها.

  • جسِّد الاستعلام لإنشاء لقطة
  • تجنّب إعادة تشغيل الاستعلامات المكلفة عدة مرات
  • اختر List أو Array أو Dictionary بما يناسب المهمة

ToList / ToArray

ينفّذ ToList/ToArray الاستعلام مرة واحدة ويخزّن النتائج؛ ولا تنعكس تغييرات المصدر اللاحقة عليها.

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
  public static void Main(string[] args)
  {
    List<int> data = new List<int>(new int[] { 1, 2, 3, 4 });

    var evensQuery = data.Where(x => x % 2 == 0);
    int[] evensArray = evensQuery.ToArray(); // snapshot now
    List<int> evensList = evensQuery.ToList(); // snapshot now

    data.Add(6); // changes after materialization

    Console.WriteLine("Array:");
    foreach (int x in evensArray) Console.WriteLine(x); // 2,4
    Console.WriteLine("List:");
    foreach (int x in evensList) Console.WriteLine(x);  // 2,4
  }
}

أساسيات ToDictionary

يجسّد ToDictionary التسلسل في Dictionary<K,V>. يجب أن تكون المفاتيح فريدة، وإلا فسيطرح استثناءً.

using System;
using System.Collections.Generic;
using System.Linq;

public sealed class City
{
  public string Name;
  public int Population;
  public City(string name, int pop){ Name = name; Population = pop; }
}

public class Program
{
  public static void Main(string[] args)
  {
    var cities = new City[]
    {
      new City("Oslo", 634000),
      new City("Rome", 2873000),
      new City("Riga", 605000)
    };

    Dictionary<string, int> byName = cities
      .ToDictionary(c => c.Name, c => c.Population);

    Console.WriteLine(byName["Rome"]); // 2873000
  }
}

العناصر المكررة: ToLookup/GroupBy

عندما يمكن أن تتكرر المفاتيح، فضّل ToLookup (قاموساً متعدد القيم) أو GroupBy بدلاً من ToDictionary.

using System;
using System.Collections.Generic;
using System.Linq;

public sealed class Item { public string Category; public string Name; public Item(string c, string n){ Category=c; Name=n; } }

public class Program
{
  public static void Main(string[] args)
  {
    var items = new Item[]
    {
      new Item("Food","Apple"),
      new Item("Food","Bread"),
      new Item("Tool","Hammer"),
      new Item("Tool","Wrench")
    };

    // If keys may repeat, use ToLookup (multi-value) or GroupBy
    var lookup = items.ToLookup(i => i.Category, i => i.Name);

    foreach (var g in lookup)
    {
      Console.WriteLine(g.Key + ":");
      foreach (var name in g) Console.WriteLine(" - " + name);
    }
  }
}

تجنّب التعداد المتعدد

يمكن لكل عملية تعداد أن تعيد تنفيذ العمل. جسّد التسلسل مرة واحدة (مثلًا باستخدام ToList) عندما ستكرّر عليه عدة مرات.

using System;
using System.Collections.Generic;
using System.Linq;

public static class Expensive
{
  public static IEnumerable<int> Numbers()
  {
    // Simulate expensive enumeration (prints when enumerated)
    for (int i = 1; i <= 3; i++)
    {
      Console.WriteLine("Produce " + i);
      yield return i;
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    var query = Expensive.Numbers().Select(x => x * x);

    Console.WriteLine("First pass:");
    foreach (int x in query) Console.WriteLine(x);

    Console.WriteLine("Second pass (re-enumerates work):");
    foreach (int x in query) Console.WriteLine(x);

    Console.WriteLine("Cache with ToList:");
    List<int> cached = query.ToList(); // runs once
    foreach (int x in cached) Console.WriteLine(x); // no extra production logs
  }
}

قائمة التحقق من التجسيد

قائمة التحقق:

  • استخدم ToList/ToArray لإنشاء لقطة.
  • استخدم ToDictionary عندما تكون المفاتيح فريدة؛ وإلا فاستخدم ToLookup/GroupBy.
  • تجنّب التعداد المتعدد للمصادر المكلفة؛ وخزّنها مؤقتاً مرة واحدة.
  • جسّد التسلسل قرب الحدود (عمليات الإدخال والإخراج واستدعاءات قاعدة البيانات) لضمان سلوك متوقع.

متطلب ToDictionary

تحقق سريع: ما الشرط الذي يجب تحققه عند استخدام ToDictionary(keySelector) على تسلسل؟

مراجعة

مراجعة: استخدم ToList/ToArray لإنشاء لقطات، وToDictionary للبحث السريع (مع مفاتيح فريدة)، وخزّن النتائج مؤقتاً لتجنّب إعادة تشغيل الاستعلامات المكلفة.

الأسئلة الشائعة

هل درس «تحويل النتائج (ToList وToDictionary) وملاحظات الأداء» مجاني؟

نعم — نص درس «تحويل النتائج (ToList وToDictionary) وملاحظات الأداء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 3 دروس في المجموع.

ماذا ستتعلم في «تحويل النتائج (ToList وToDictionary) وملاحظات الأداء»؟

حوّل الاستعلامات المؤجلة إلى مجموعات ملموسة باستخدام ToList/ToArray/ToDictionary؛ وتجنب التعداد المتكرر، وافهم قواعد تفرد المفاتيح. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 3.

كم من الوقت يستغرق درس «تحويل النتائج (ToList وToDictionary) وملاحظات الأداء»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. GroupBy وJoin وAggregate والإسقاط (الأنواع المجهولة)
  2. تحويل النتائج (ToList وToDictionary) وملاحظات الأداء
  3. نصائح القابلية للتركيب
← العودة إلى C# Academy