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

تعليقات

المشاركات الشائعة من هذه المدونة

C# - Arrays

Entity Framework - ما هو ORM؟ ونبذة عن Dapper وNHibernate

Entity Framework - مقدمة عن Entity Framework