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.


الاختلافات الرئيسية:

  1. التعامل مع العناصر غير المتوافقة:
    • Cast<T>(): ترمي استثناء عند وجود عنصر غير قابل للتحويل.
    • OfType<T>(): تتجاهل العناصر غير المتوافقة دون استثناء.
  2. الهدف من الاستخدام:
    • Cast<T>(): عند التأكد من تطابق جميع العناصر مع النوع المطلوب.
    • OfType<T>(): عند العمل مع بيانات مختلطة وتريد استخراج نوع معين فقط.
  3. التعامل مع null:
    • OfType<T>(): تتجاهل null إذا كان النوع T مرجعيًا.
    • Cast<T>(): قد ترمي استثناء عند محاولة تحويل null إلى نوع قيمة.
  4. التنفيذ:
    • كلاهما يستخدم التنفيذ المؤجل (Deferred Execution).


متى تستخدم كل دالة؟

  • استخدم Cast<T>(): عندما تكون متأكدًا من أن جميع العناصر قابلة للتحويل، وتريد التقاط الأخطاء.
  • استخدم OfType<T>(): عندما تحتوي المجموعة على عناصر مختلطة وتريد تصفية نوع معين دون أخطاء.


تعليقات

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

C# - Arrays

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

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