كيفية الحصول على قائمة متميزة ومرتبة من الأسماء من DataTable باستخدام LINQ

استخدام LINQ لمعالجة البيانات من DataTable يمكن أن يكون قويًا جدًا، ولكنه يمكن أن يؤدي أيضًا إلى نتائج غير متوقعة إذا لم تتم معالجته بشكل صحيح. في هذه التدوينة، سنستكشف مشكلة شائعة: إنشاء قائمة مرتبة من أسماء فريدة من DataTable. سنتناول سبب عدم تقديم استعلام مباشر للترتيب المتوقع ونقدم حلاً منظمًا.

المشكلة

لديك DataTable يحتوي على عمود للأسماء، وتريد استخراج مجموعة متميزة من هذه الأسماء مرتبة بشكل أبجدي. يبدو استعلام LINQ المعتاد كما يلي:

var names =
    (from DataRow dr in dataTable.Rows
    orderby (string)dr["Name"]
    select (string)dr["Name"]).Distinct();

للوهلة الأولى، يبدو هذا صحيحًا، لكن قد تلاحظ أن جملة orderby لا تفرض الترتيب المتوقع في النتيجة النهائية. لماذا يحدث ذلك؟

فهم المشكلة

عندما تستخدم دالة Distinct() بعد ترتيب النتائج، قد يؤدي ذلك غالبًا إلى حدوث ارتباك. عملية الحصول على القيم الفريدة منفصلة عن كيفية ترتيب هذه القيم.

لماذا قد لا يعمل الترتيب

  • دالة Distinct() قد لا تحافظ على الترتيب الذي أنشأته orderby. عندما تعالج البيانات، تركز فقط على القيم الفريدة دون الاحتفاظ بالترتيب.

لتحقيق كل من الفريدة والترتيب، نحتاج إلى ضبط نهج LINQ الخاص بنا.

حل منظم

للتأكد من أنك تحصل على أسماء متميزة ومرتبة، يمكنك تقسيم العملية إلى ثلاث خطوات واضحة:

الخطوة 1: اختيار الأسماء في قائمة جديدة

أولاً، اجمع كل الأسماء في مجموعة. يمكنك إجراء إسقاط خلال هذه الخطوة إذا لزم الأمر.

var x1 = 
    (from DataRow dr in dataTable.Rows
    select (string)dr["Name"]).ToList();

الخطوة 2: إنشاء قائمة متميزة

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

var x2 = x1.Distinct().ToList();

الخطوة 3: إنشاء قائمة مرتبة

أخيرًا، خذ القائمة المميزة وقم بترتيبها أبجدياً.

var orderedNames = x2.OrderBy(name => name).ToList();

مثال كامل على الكود

إليك كيف يبدو الكود الكامل عندما يتم تجميعه:

var x1 = 
    (from DataRow dr in dataTable.Rows
    select (string)dr["Name"]).ToList();

var x2 = x1.Distinct().ToList();

var orderedNames = x2.OrderBy(name => name).ToList();

الخاتمة

من خلال تقسيم استعلام LINQ إلى أجزاء متعددة، يمكننا بفعالية الحصول على قائمة متميزة من الأسماء من DataTable مرتبة أيضًا بشكل أبجدي. هذه الطريقة تعزز من قابلية قراءة وصيانة الكود الخاص بك، مما يضمن أن تكون كل خطوة من العملية واضحة ومنطقية.

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

لا تتردد في تجربة هذه الطريقة وانظر كيف تعمل لاحتياجات بياناتك!