Cast() وOfType
Differences Between Cast<T>() and OfType<T>() in LINQ
في LINQ، تُستخدم الدالتان Cast<T>() وOfType<T>() لتحويل أو تصفية عناصر مجموعة غير عامة (IEnumerable
) إلى نوع محدد (T
). ومع ذلك، هناك اختلافات جوهرية في كيفية تعامل كل منهما مع العناصر التي لا يمكن تحويلها إلى النوع المستهدف.
دالة Cast<T>():
- الغرض: تحاول تحويل كل عنصر في المجموعة إلى النوع المحدد (
T
). - السلوك: إذا واجهت عنصرًا لا يمكن تحويله إلى النوع
T
، فإنها ترمي استثناءً من نوعInvalidCastException
. - الاستخدام المناسب: عند التأكد من أن جميع العناصر في المجموعة هي من النوع
T
أو يمكن تحويلها إليه، وتريد أن يتم إعلامك بأي خطأ في التحويل عبر استثناء.
مثال على Cast<T>():
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
ArrayList list = new ArrayList { 10, 20, 30, "50" };
try
{
IEnumerable<int> result = list.Cast<int>();
foreach (int i in result)
{
Console.WriteLine(i);
}
}
catch (InvalidCastException ex)
{
Console.WriteLine($"استثناء: {ex.Message}");
}
}
}
الناتج:
10
20
30
استثناء: Unable to cast object of type 'System.String' to type 'System.Int32'.
في هذا المثال، ترمي الدالة Cast<int>()
استثناءً عند محاولة تحويل السلسلة النصية "50" إلى عدد صحيح.
دالة OfType<T>():
- الغرض: تقوم بتصفية العناصر في المجموعة، بحيث تُرجع فقط العناصر التي يمكن تحويلها إلى النوع المحدد (
T
). - السلوك: تتجاهل بصمت أي عناصر لا يمكن تحويلها إلى النوع
T
دون رمي استثناء. - الاستخدام المناسب: عند التعامل مع مجموعة تحتوي على أنواع مختلفة من العناصر، وترغب في استخراج العناصر التي تتوافق مع النوع
T
فقط، مع تجاهل العناصر الأخرى.
مثال على OfType<T>():
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
ArrayList list = new ArrayList { 10, 20, 30, "50" };
IEnumerable<int> result = list.OfType<int>();
foreach (int i in result)
{
Console.WriteLine(i);
}
}
}
الناتج:
10
20
30
في هذا المثال، تتجاهل الدالة OfType<int>()
العنصر "50" لأنه لا يمكن تحويله إلى عدد صحيح، وتُرجع فقط العناصر التي يمكن تحويلها إلى النوع int
.
الاختلافات الرئيسية:
-
التعامل مع العناصر غير المتوافقة:
- Cast<T>(): ترمي استثناء عند وجود عنصر غير قابل للتحويل.
- OfType<T>(): تتجاهل العناصر غير المتوافقة دون استثناء.
-
الهدف من الاستخدام:
- Cast<T>(): عند التأكد من تطابق جميع العناصر مع النوع المطلوب.
- OfType<T>(): عند العمل مع بيانات مختلطة وتريد استخراج نوع معين فقط.
-
التعامل مع null:
- OfType<T>(): تتجاهل null إذا كان النوع
T
مرجعيًا. - Cast<T>(): قد ترمي استثناء عند محاولة تحويل null إلى نوع قيمة.
- OfType<T>(): تتجاهل null إذا كان النوع
-
التنفيذ:
- كلاهما يستخدم التنفيذ المؤجل (Deferred Execution).
متى تستخدم كل دالة؟
- استخدم
Cast<T>()
: عندما تكون متأكدًا من أن جميع العناصر قابلة للتحويل، وتريد التقاط الأخطاء. - استخدم
OfType<T>()
: عندما تحتوي المجموعة على عناصر مختلطة وتريد تصفية نوع معين دون أخطاء.
تعليقات
إرسال تعليق