أنماط القوائم وTuples
فكّك المجموعات
أنماط القوائم وTuples درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
أنماط tuple
يطابق نمط tuple عدة قيم في الوقت نفسه من خلال وضعها بين قوسين. ويُطابق كل موضع باستخدام نمطه الفرعي الخاص.
يُعد ذلك مناسبًا للقرارات التي تعتمد على عدة مدخلات، مثل آلة حالات صغيرة أو حَكَم لعبة حجر-ورق-مقص، وكل ذلك داخل switch واحد.
int x = 0, y = 5;
string quadrant = (x, y) switch
{
(0, 0) => "origin",
(0, _) => "y-axis",
(_, 0) => "x-axis",
_ => "plane"
};
System.Console.WriteLine(quadrant);تبديل tuple قابل للتشغيل
تجعل أنماط tuple جداول القرارات سهلة القراءة. هنا يحدد متغيران منطقيان الإجراء المطلوب.
يسرد كل فرع نمط tuple، ويعني الرمز _ في أحد المواضع أن تلك الخانة يمكن أن تحتوي على أي قيمة. ويغطي الفرع الأخير _ بقية الحالات.
using System;
class Program {
static string Move(bool fwd, bool turn) => (fwd, turn) switch {
(true, false) => "straight",
(true, true) => "curve",
(false, true) => "spin",
_ => "stop"
};
static void Main() => Console.WriteLine(Move(true, true));
}الربط داخل tuple
يمكن للمواضع داخل نمط tuple التقاط القيم. يطابق (0, var y) الحالة التي يكون فيها العنصر الأول هو 0، ويربط العنصر الثاني بالمتغير y.
يمكنكم بعد ذلك استخدام المتغير المرتبط في ناتج الفرع أو في حراسة when، وبذلك تجمعون بين المطابقة والاستخراج في خطوة واحدة.
var point = (0, 7);
string r = point switch
{
(0, var y) => $"on y-axis at {y}",
(var x, 0) => $"on x-axis at {x}",
_ => "elsewhere"
};
System.Console.WriteLine(r);أنماط القوائم
يطابق نمط القائمة المصفوفات والقوائم وفقًا لعناصرها، ويُكتب باستخدام الأقواس المربعة: [1, 2, 3]. وتنجح المطابقة عندما يتوافق الطول ونمط كل عنصر.
أُضيفت أنماط القوائم في C# 11، وهي تتيح لكم اتخاذ الفروع بناءً على شكل التسلسل مباشرةً، من دون فحوصات يدوية للطول والفهارس.
int[] data = { 1, 2, 3 };
string shape = data switch
{
[] => "empty",
[_] => "one",
[_, _] => "two",
_ => "many"
};
System.Console.WriteLine(shape);مطابقة العناصر المحددة
يمكن لأنماط القوائم مطابقة قيم محددة في كل موضع. لا يطابق [1, 2, 3] إلا تسلسلًا محددًا يتكون من ثلاثة عناصر.
يمكنكم المزج بحرية بين الثوابت وعناصر التجاهل: يطابق [1, _, 3] قائمةً من ثلاثة عناصر تبدأ بـ 1 وتنتهي بـ 3، مع تجاهل العنصر الأوسط.
using System;
class Program {
static void Main() {
int[] a = { 1, 9, 3 };
bool ok = a is [1, _, 3];
Console.WriteLine(ok);
}
}نمط الشريحة
يطابق نمط الشريحة .. أي عدد من العناصر، بما في ذلك صفر، في موضع واحد. ويمكن أن يحتوي نمط القائمة على شريحة واحدة كحد أقصى.
يطابق [1, .., 9] أي قائمة تبدأ بـ 1 وتنتهي بـ 9، بصرف النظر عما يوجد بينهما. وهذا مفيد جدًا لفحص العنصر الأول والأخير.
int[] nums = { 1, 4, 5, 9 };
string r = nums switch
{
[1, .., 9] => "1..9 bookends",
_ => "other"
};
System.Console.WriteLine(r);التقاط شريحة
يمكن للشريحة التقاط العناصر التي تم تخطيها داخل متغير باستخدام var: [first, .. var rest].
يكون الجزء الملتقط نفسه مصفوفة أو قائمة من النوع المطابق، ما يتيح لكم تفكيك العنصر الأول والاحتفاظ ببقية العناصر لمعالجتها لاحقًا.
using System;
class Program {
static void Main() {
int[] xs = { 10, 20, 30, 40 };
if (xs is [var head, .. var tail])
Console.WriteLine($"{head} then {tail.Length} more");
}
}ربط العناصر الطرفية
يمكنكم ربط الطرفين المحيطين بشريحة: [var first, .., var last] يلتقط العنصرين الأول والأخير مع تجاهل العناصر الوسطى.
تُعد هذه الصيغة موجزة للتسلسلات التي لا تهم فيها إلا الحدود، مثل التحقق من أن المسار يبدأ وينتهي عند نقطتين معروفتين.
using System;
class Program {
static void Main() {
string[] route = { "A", "B", "C", "D" };
if (route is [var start, .., var end])
Console.WriteLine($"{start} -> {end}");
}
}أنماط القوائم مع الأنماط الفرعية
يمكن لكل موضع في القائمة استخدام أي نمط، بما في ذلك الأنماط العلاقية والمنطقية. يطابق [> 0, > 0] قائمةً من عنصرين موجبين.
يجمع هذا بين جميع أدوات الأنماط لمطابقة التسلسلات، بحيث يمكنكم التحقق من الشكل والمحتوى في تعبير واحد.
int[] pair = { 3, 8 };
string r = pair switch
{
[> 0, > 0] => "both positive",
[_, _] => "mixed",
_ => "wrong size"
};
System.Console.WriteLine(r);تداخل tuple والقوائم
يمكن تداخل أنماط tuple والقوائم داخل بعضها بعضًا وداخل أنماط الخصائص. ويمكن لموضع في tuple أن يحتوي على نمط قائمة، والعكس صحيح.
يتيح لكم ذلك مطابقة بيانات مهيكلة ومعقدة، مثل تسلسل ذي تسميات، في تعبير واحد بدلًا من عدة فحوصات متداخلة.
using System;
class Program {
static void Main() {
(string, int[]) record = ("primes", new[]{ 2, 3 });
string r = record switch {
("primes", [2, ..]) => "starts with 2",
_ => "other"
};
Console.WriteLine(r);
}
}متطلبات أنماط القوائم
تعمل أنماط القوائم مع أي نوع قابل للعد وقابل للفهرسة: إذ يحتاج إلى خاصية Length أو Count ومفهرس. وتندرج المصفوفات وList<T> والسلاسل النصية ضمن هذه الأنواع.
يتطلب التقاط الشريحة بالإضافة إلى ذلك أسلوب شريحة أو مفهرس نطاق. وتدعم معظم المجموعات المضمنة الأمرين مباشرةً.
string s = "cat";
bool isCat = s is ['c', 'a', 't'];
System.Console.WriteLine(isCat);اختبار سريع
اختبروا فهمكم لأنماط القوائم وtuple.
مراجعة
تطابق أنماط tuple عدة قيم بين قوسين؛ بينما تطابق أنماط القوائم شكل التسلسل بين أقواس مربعة، وتستخدم .. كشريحة يمكنها التقاط الجزء الأوسط عبر var.
تقبل المواضع أي نمط فرعي ويمكن تداخلها بحرية. وتتطلب أنماط القوائم نوعًا قابلًا للعد والفهرسة. وبذلك أصبحتم الآن تملكون مجموعة أدوات الأنماط الكاملة في C#.
الأسئلة الشائعة
هل درس «أنماط القوائم وTuples» مجاني؟
نعم — نص درس «أنماط القوائم وTuples» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «أنماط القوائم وTuples»؟
فكّك المجموعات تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «أنماط القوائم وTuples»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعبيرات switch
- أنماط النوع والخاصية
- الأنماط العلاقية والمنطقية
- أنماط القوائم وTuples