الفرق بين Cast و OfType في LINQ
الفرق بين Cast و OfType في LINQ
في LINQ، كل من
Cast<T>() و OfType<T>() تُستخدم لتحويل تسلسل من عناصر إلى نوع معين.
لكن كل واحدة منهما تعمل بطريقة مختلفة، ودي أهم الفروقات بينهم.
1. Cast()
الاستخدام:
تُستخدم لتحويل كل عنصر في تسلسل IEnumerable إلى نوع معين T.
السلوك:
- إذا كان أي عنصر لا يمكن تحويله إلى
T→ يتم رمي استثناءInvalidCastException. - يُفترض أن كل العناصر قابلة للتحويل إلى
T.
مثال:
ArrayList list = new ArrayList() { 1, 2, 3, "four", 5 };
var result = list.Cast<int>();
foreach (var item in result)
{
Console.WriteLine(item);
}
النتيجة:
1
2
3
(ثم استثناء)
الخطأ:
System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Int32'.
2. OfType()
الاستخدام:
تُستخدم لتصفية العناصر من تسلسل IEnumerable بحيث تُرجع فقط العناصر التي يمكن تحويلها إلى النوع T.
السلوك:
- تتجاهل بصمت العناصر التي لا تتطابق مع النوع
T. - لا يتم رمي استثناءات.
مثال:
ArrayList list = new ArrayList() { 1, 2, 3, "four", 5 };
var result = list.OfType<int>();
foreach (var item in result)
{
Console.WriteLine(item);
}
النتيجة:
1
2
3
5
السلسلة "four" تم تجاهلها لأنّها ليست
int.
جدول مقارنة:
| المقارنة | Cast() | OfType() |
|---|---|---|
| ماذا تفعل؟ | تحوّل كل العناصر إلى النوع المحدد | تُرجع فقط العناصر اللي تطابق النوع |
| لو عنصر غير متطابق؟ | ترمي استثناء InvalidCastException |
تتجاهله بصمت |
| نوع التنفيذ | تنفيذ مؤجل (Deferred Execution) | تنفيذ مؤجل أيضًا |
| هل تُفلتر العناصر؟ | لا | نعم |
| الأفضل لـ | عندما تكون متأكد من نوع كل العناصر | عندما تتعامل مع مجموعة مختلطة الأنواع |
متى تستخدم كل واحدة؟
- ✅ استخدم
Cast<T>()لما تكون متأكد إن كل العناصر في التسلسل من نفس النوع. - ✅ استخدم
OfType<T>()لما تكون العناصر من أنواع مختلفة وعايز تتجنب الأخطاء.
تعليقات
إرسال تعليق