التصفية باستخدام Where
حدّد العناصر المطابقة
التصفية باستخدام Where درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
ما الذي يفعله Where
يُعد Where عامل التصفية الأساسي في LINQ. فهو يتلقى predicate، أي دالة تُرجع bool، ولا يُنتج إلا العناصر التي تستوفيه.
يوجد هذا العامل في System.Linq، ويعمل مع أي IEnumerable<T>، إذ يُرجع تسلسلًا جديدًا بدلًا من تعديل المصدر.
using System;
using System.Linq;
using System.Collections.Generic;
var nums = new List<int> { 1, 2, 3, 4, 5, 6 };
var evens = nums.Where(n => n % 2 == 0);
Console.WriteLine(string.Join(", ", evens));دالة predicate المجهولة
الوسيط المُمرر إلى Where هو lambda بالصيغة n => condition. ويمثل المعامل كل عنصر، بينما يجب أن يُقيَّم جسم الدالة إلى true أو false.
يؤدي إرجاع true إلى الاحتفاظ بالعنصر، بينما يؤدي false إلى استبعاده. ويمكن استخدام أي تعبير منطقي.
using System;
using System.Linq;
string[] words = { "apple", "fig", "banana", "kiwi" };
var shortWords = words.Where(w => w.Length <= 4);
Console.WriteLine(string.Join(", ", shortWords));صيغة بناء الاستعلام
يوفر LINQ صيغة استعلام تُقرأ مثل SQL. تعمل عبارة where على التصفية، بينما تنفذ select الإسقاط.
تُترجم هذه الصيغة إلى استدعاءات الأساليب نفسها، ولذلك فإن from x in src where ... select x مطابقة لـ src.Where(...). استخدموا الصيغة الأسهل قراءة.
using System;
using System.Linq;
int[] scores = { 40, 75, 90, 55, 88 };
var passing = from s in scores
where s >= 60
select s;
Console.WriteLine(string.Join(", ", passing));دمج الشروط
يمكنكم داخل predicate واحد دمج عدة فحوصات باستخدام && و||. ويساعد ذلك على إبقاء التصفية المرتبطة ضمن مرور واحد.
تساعد الأقواس على تحسين قابلية القراءة عند مزج العوامل، كما هو الحال في أي تعبير منطقي.
using System;
using System.Linq;
using System.Collections.Generic;
var ages = new List<int> { 12, 17, 21, 35, 64, 70 };
var adults = ages.Where(a => a >= 18 && a < 65);
Console.WriteLine(string.Join(", ", adults));تسلسل استدعاءات Where
يمكنكم تسلسل عدة استدعاءات لـ Where. إذ تعمل كل واحدة على تصفية ناتج السابقة، فتتحد الشروط باستخدام AND المنطقي.
يكون التسلسل أحيانًا أوضح من predicate واحد كبير، كما يتيح لكم تركيب عوامل التصفية التي أُنشئت في أماكن مختلفة.
using System;
using System.Linq;
int[] data = { 3, 8, 15, 22, 27, 40 };
var result = data.Where(n => n > 5)
.Where(n => n % 2 == 0);
Console.WriteLine(string.Join(", ", result));Where مع الفهرس
يوفر أحد التحميلات الزائدة لـ Where فهرس العنصر الصفري-based كمعامل ثانٍ في lambda. وهذا مفيد للتصفية القائمة على الموضع.
استخدموه للاحتفاظ، مثلًا، بكل عنصر آخر أو لتخطي العنصر الأول استنادًا إلى الفهرس.
using System;
using System.Linq;
string[] items = { "a", "b", "c", "d", "e" };
var evenIdx = items.Where((val, idx) => idx % 2 == 0);
Console.WriteLine(string.Join(", ", evenIdx));تصفية الكائنات
تتألق التصفية عند تطبيقها على مجموعات من الكائنات. إذ يمكن لـ predicate قراءة أي خاصية في كل عنصر.
بهذه الطريقة تعبّرون عن قواعد العمل — مثل «العملاء في هذه المدينة» و«الطلبات التي تتجاوز حدًا معينًا» — بصورة تصريحية.
using System;
using System.Linq;
using System.Collections.Generic;
record Product(string Name, decimal Price);
var list = new List<Product> {
new("Pen", 1.5m), new("Lamp", 20m), new("Mug", 8m) };
var cheap = list.Where(p => p.Price < 10);
foreach (var p in cheap) Console.WriteLine(p.Name);التنفيذ المؤجل
يستخدم Where التنفيذ المؤجل: فهو لا يعمل عند تعريفه، بل فقط عند تكرار التسلسل، مثلًا داخل foreach أو عند استدعاء ToList.
وهذا يعني أن التغييرات التي تطرأ على المصدر قبل التكرار ستنعكس في النتيجة.
using System;
using System.Linq;
using System.Collections.Generic;
var src = new List<int> { 1, 2 };
var q = src.Where(n => n > 1);
src.Add(5);
Console.WriteLine(string.Join(", ", q));تكلفة إعادة التقييم
بما أن التصفية مؤجلة، فإن تكرار الاستعلام نفسه مرتين يعيد تشغيل predicate مرتين. وقد يفاجئكم ذلك عند استخدام predicates مكلفة أو مصادر متغيرة.
عندما تحتاجون إلى لقطة ثابتة قابلة لإعادة الاستخدام، نفّذوا المادة مرة واحدة باستخدام ToList — وسنتناول ذلك لاحقًا في هذه الدورة.
using System;
using System.Linq;
int calls = 0;
int[] nums = { 1, 2, 3 };
var q = nums.Where(n => { calls++; return n > 1; });
foreach (var _ in q) { }
foreach (var _ in q) { }
Console.WriteLine(calls);التصفية ثم العد
من الأنماط الشائعة التصفية ثم معرفة عدد العناصر المطابقة. ويمكن لـ Count تلقي predicate مباشرةً، فتجميع التصفية والعد في خطوة واحدة.
إن count.Count(p => cond) مكافئ لـ seq.Where(p => cond).Count()، لكنه أكثر إحكامًا في القراءة.
using System;
using System.Linq;
int[] grades = { 55, 80, 42, 91, 67 };
int passed = grades.Count(g => g >= 60);
Console.WriteLine($"Passed: {passed}");النتائج الفارغة مقبولة
إذا لم يستوفِ أي عنصر predicate، فإن Where يُنتج ببساطة تسلسلًا فارغًا، وليس null أبدًا.
وهذا يجعل تسلسل عوامل التصفية آمنًا: إذ يمر الناتج الفارغ عبر العوامل اللاحقة من دون معالجة خاصة.
using System;
using System.Linq;
int[] nums = { 1, 2, 3 };
var big = nums.Where(n => n > 100);
Console.WriteLine($"Count: {big.Count()}");اختبار سريع
اختبروا فهمكم للتنفيذ المؤجل.
مراجعة
يُصفي Where تسلسلًا باستخدام predicate منطقية، ويُرجع IEnumerable جديدًا. وله تحميل زائد يقبل الفهرس، ويمكن تسلسله أو دمجه مع &&/||، كما يعمل مع الكائنات عبر خصائصها.
والأهم أنه مؤجل التنفيذ؛ فهو يعمل عند التكرار، ولذلك تؤدي إعادة التكرار إلى إعادة التقييم. سنتعلم بعد ذلك كيفية تشكيل العناصر التي نحتفظ بها باستخدام Select.
الأسئلة الشائعة
هل درس «التصفية باستخدام Where» مجاني؟
نعم — نص درس «التصفية باستخدام Where» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «التصفية باستخدام Where»؟
حدّد العناصر المطابقة تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «التصفية باستخدام Where»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التصفية باستخدام Where
- التحديد والإسقاط
- الترتيب والتجميع باستخدام OrderBy
- التجميعات وToList