التحديد والإسقاط
شكّل البيانات في صور جديدة
التحديد والإسقاط درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
ما المقصود بالإسقاط
يحوّل Select كل عنصر في التسلسل إلى شكل جديد. ويُسمى ذلك الإسقاط.
يتلقى هذا العامل lambda تربط عنصرًا واحدًا بنتيجة، ثم يُرجع تسلسلًا من تلك النتائج، مع إبقاء المصدر دون تغيير.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4 };
var squares = nums.Select(n => n * n);
Console.WriteLine(string.Join(", ", squares));تغيير النوع
يمكن للإسقاط تغيير نوع العناصر بالكامل. ويؤدي تحويل int إلى string إلى إنتاج IEnumerable<string>.
يُستنتج نوع الناتج من نوع القيمة التي تُرجعها lambda، ولذلك يتولى المترجم تتبعه نيابةً عنكم.
using System;
using System.Linq;
int[] nums = { 10, 20, 30 };
var labels = nums.Select(n => $"Item #{n}");
foreach (var l in labels) Console.WriteLine(l);إسقاط الخصائص
من الاستخدامات الشائعة استخراج خاصية واحدة من الكائنات. يحوّل Select(p => p.Name) قائمةً من الكائنات إلى قائمة من الأسماء.
يؤدي ذلك إلى حصر البيانات في ما تحتاجونه فقط قبل إجراء معالجة إضافية أو عرضها.
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var names = users.Select(u => u.Name);
Console.WriteLine(string.Join(", ", names));نتائج النوع المجهول
يمكنكم الإسقاط إلى نوع مجهول للاحتفاظ بعدة حقول معًا. استخدموا new { ... } داخل lambda.
ينشئ المترجم فئةً مباشرةً تحتوي على خصائص للقراءة فقط، وهو ما يناسب تشكيل النتائج الوسيطة.
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var shaped = users.Select(u => new { u.Name, IsAdult = u.Age >= 18 });
foreach (var s in shaped) Console.WriteLine($"{s.Name}:{s.IsAdult}");Select مع الفهرس
مثل Where، يملك Select تحميلًا زائدًا يعرض الفهرس الصفري-based. وتتلقى lambda المعاملين (element, index).
وهذا مثالي لترقيم العناصر أو إقران كل قيمة بموضعها.
using System;
using System.Linq;
string[] tasks = { "Wake", "Eat", "Code" };
var numbered = tasks.Select((t, i) => $"{i + 1}. {t}");
foreach (var n in numbered) Console.WriteLine(n);Select في بناء الاستعلام
تنفذ عبارة select الإسقاط في صيغة الاستعلام. ويمكنكم اختيار العنصر نفسه أو أي تعبير يعتمد عليه.
ادمجوها مع where للتصفية وتشكيل البيانات ضمن استعلام واحد سهل القراءة.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5 };
var result = from n in nums
where n % 2 == 1
select n * 10;
Console.WriteLine(string.Join(", ", result));يقوم SelectMany بالتسطيح
عندما يُحوّل كل عنصر إلى مجموعة، سينتج عن Select تسلسل من التسلسلات. أما SelectMany فيُسطّح هذه التسلسلات إلى تسلسل واحد.
وهو المكافئ في LINQ لحلقة متداخلة تصل النتائج الداخلية معًا.
using System;
using System.Linq;
using System.Collections.Generic;
var groups = new List<int[]> { new[] {1, 2}, new[] {3, 4} };
var flat = groups.SelectMany(g => g);
Console.WriteLine(string.Join(", ", flat));الإسقاط مؤجل أيضًا
يشترك Select في نموذج التنفيذ المؤجل. فلا تعمل lambda الخاصة بالتحويل إلا عند تعداد التسلسل.
لذلك يكون إنشاء الإسقاط قليل التكلفة، بينما يحدث العمل عند تكرار النتيجة أو تنفيذها ماديًا.
using System;
using System.Linq;
int runs = 0;
int[] nums = { 1, 2, 3 };
var q = nums.Select(n => { runs++; return n; });
Console.WriteLine($"Before: {runs}");
foreach (var _ in q) { }
Console.WriteLine($"After: {runs}");التصفية ثم الإسقاط
يهم الترتيب من أجل الوضوح والكفاءة: صفّوا العناصر أولًا باستخدام Where، ثم نفذوا الإسقاط باستخدام Select، وبذلك لا تحوّلون إلا العناصر التي تحتفظون بها.
يُقرأ هذا المسار من الأعلى إلى الأسفل، ويتجنب إجراء عمل إسقاط غير ضروري.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5, 6 };
var result = nums.Where(n => n % 2 == 0)
.Select(n => n * n);
Console.WriteLine(string.Join(", ", result));الإسقاط إلى record جديد
بدلًا من الأنواع المجهولة، يمكنكم الإسقاط إلى نوع مسمى أو إلى record. وهذا مفيد عندما تعبر النتائج حدود الأساليب، لأن الأنواع المجهولة لا يمكن إرجاعها باسم معروف.
وهذه أيضًا الطريقة التي تُبنى بها DTOs انطلاقًا من كائنات المجال الأكثر ثراءً.
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
record Summary(string Name);
var users = new List<User> { new("Ana", 30) };
var dtos = users.Select(u => new Summary(u.Name));
foreach (var d in dtos) Console.WriteLine(d.Name);يحافظ Select على الترتيب والعدد
على خلاف Where، لا يضيف Select عناصر أو يزيلها أبدًا، بل يربط كل عنصر بعنصر واحد. لذلك يكون للناتج العدد والترتيب نفسيهما الموجودين في الإدخال.
إذا كنتم تحتاجون إلى عناصر أقل، فاستخدموا التصفية؛ وإذا كنتم تحتاجون إلى عناصر أكثر من كل عنصر، فاستخدموا SelectMany.
using System;
using System.Linq;
int[] nums = { 5, 1, 9 };
var doubled = nums.Select(n => n * 2);
Console.WriteLine($"In:{nums.Length} Out:{doubled.Count()}");اختبار سريع
اختاروا العامل المناسب للمهمة.
مراجعة
ينفذ Select إسقاط كل عنصر إلى شكل جديد — خاصية أو سلسلة نصية أو نوع مجهول أو record — مع الحفاظ على العدد والترتيب بعلاقة واحد لواحد. وله تحميل زائد يقبل الفهرس، كما أن تنفيذه مؤجل.
يُسطّح SelectMany التسلسلات المتداخلة. وسنتعلم بعد ذلك كيفية ترتيب البيانات التي شكّلناها وتجميعها.
الأسئلة الشائعة
هل درس «التحديد والإسقاط» مجاني؟
نعم — نص درس «التحديد والإسقاط» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «التحديد والإسقاط»؟
شكّل البيانات في صور جديدة تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «التحديد والإسقاط»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.