الفرق بين 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>()
لما تكون العناصر من أنواع مختلفة وعايز تتجنب الأخطاء.
تعليقات
إرسال تعليق