المقدمة

إذا كنت قد عملت سابقًا مع LINQ في C#، فقد تكون واجهت خطأ عند محاولة الفهرسة في متغير يستخدم استعلام LINQ. يمكن أن يكون هذا الخطأ محبطًا للغاية، خاصة إذا لم تكن متأكدًا من ما هو الخطأ أو كيفية إصلاحه. في هذه التدوينة، سنستعرض كيفية الفهرسة بشكل صحيح في متغير في LINQ، وخاصة عند العمل مع أنواع مثل IEnumerable<T>. سنقوم بتفصيل الحل خطوة بخطوة، مما يوفر لك فهمًا واضحًا للمشكلة وكيفية حلها بفعالية.

المشكلة: خطأ الفهرسة في LINQ

عندما تحاول الفهرسة في متغير تم إنشاؤه بواسطة استعلام LINQ، كما في المثال أدناه، قد تتلقى رسالة خطأ مثل:

لا يمكن تطبيق الفهرسة باستخدام [] على تعبير من نوع 'System.Collections.Generic.IEnumerable<AnonymousType#1>'

يمكن أن يكون هذا محيرًا، خاصة إذا كنت تتوقع أن يتم فهرسة المصفوفات أو القوائم مباشرة. إليك الكود المسبب للمشكلة الذي قد تكون واجهته:

string[] sa = {"one", "two", "three"};
sa[1].Dump(); // هذا يعمل بشكل جيد

var va = sa.Select((a,i) => new { Line = a, Index = i });
va[1].Dump(); // هذا يسفر عن خطأ

فهم LINQ وIEnumerable

للوصول إلى جوهر هذه المشكلة، نحتاج إلى النظر في مفهومين رئيسيين: LINQ و IEnumerable.

ما هو LINQ؟

LINQ، أو استعلام تم دمجه في اللغة، يُستخدم في C# لتبسيط العمل مع مجموعات البيانات. يوفر بنية استعلام عالية المستوى يمكن تطبيقها على مصادر بيانات متنوعة، مثل المصفوفات والقوائم وقواعد البيانات.

ما هو IEnumerable؟

واجهة IEnumerable<T> تمثل مجموعة من الكائنات التي يمكن تعدادها ولكن لا تسمح بالفهرسة المباشرة مثل المصفوفات أو القوائم. تدعم بشكل أساسي التكرار من خلال المجموعة باستخدام طريقة GetEnumerator() لكنها تفتقر إلى الدعم للفهرسة مباشرة.

الحل: استخدام ElementAt

نظرًا لأنك لا تستطيع الفهرسة مباشرة في IEnumerable<T>، فإن الحل بسيط: استخدم طريقة التمديد ElementAt(int) التي تقدمها LINQ. تتيح لك هذه الطريقة استرداد العناصر بواسطة فهارسها بأمان وفعالية.

كيفية استخدام ElementAt

إليك كيفية تعديل الكود الابتدائي لـ LINQ لتجنب خطأ الفهرسة:

using System.Linq; // تأكد من تضمين هذه الفضاء الاسم

string[] sa = {"one", "two", "three"};
sa[1].Dump(); // الفهرسة صحيحة على المصفوفة

var va = sa.Select((a, i) => new { Line = a, Index = i });
va.ElementAt(1).Dump(); // الاستخدام الصحيح مع طريقة ElementAt

النقاط الرئيسية

  • IEnumerable لا تدعم الفهرسة المباشرة: لا يمكنك استخدام [] للفهرسة في نتيجة استعلام LINQ.
  • استخدم ElementAt(int): للوصول إلى العناصر بواسطة الفهرس في LINQ، استخدم طريقة التمديد ElementAt().
  • تأكد من تضمين مساحة الاسم System.Linq: لاستخدام ElementAt()، تأكد من تضمين مساحة الاسم System.Linq اللازمة في كودك.

الخاتمة

يمكن أن تكون الفهرسة في متغير باستخدام LINQ محيرة، ولكن من خلال فهم كيفية عمل IEnumerable واستخدام طريقة ElementAt(int)، يمكنك الوصول بسهولة إلى البيانات التي تحتاجها. هذا لا يحل الخطأ الفوري فحسب، بل يجهزك أيضًا بالمعرفة للتنقل في سيناريوهات مشابهة في المستقبل. سعيد بالتشفير!