ما هي الطريقة الأكثر كفاءة لإنشاء قائمة مميزة من العناصر باستخدام .NET؟

StackOverflow https://stackoverflow.com/questions/1727894

سؤال

لدي قائمة كبيرة من القيم (100-200 سلسلة أحرف) وأحتاج إلى إرجاع قائمة متميزة منهم. ما هي الطريقة الأكثر كفاءة للقيام بذلك باستخدام .NET؟ 2 طرق يمكنني التفكير فيها هي:

  1. استخدم الطريقة المميزة () للفئة IEnumerable
  2. إستخدم المعجم

إذا كان نهج القاموس أسرع في المصطلحات الخام، ففكر في قرار المقايضة حول إمكانية الصيانة.

هل كانت مفيدة؟

المحلول

أتوقع Enumerable.Distinct أن تكون أكثر بأسرع استخدام القاموس إذا كنت تفعل ذلك مرة واحدة فقط. إذا كنت ترغب في أن تكون قادرا على إضافة / إزالة القيم والحفاظ على NESS مميزا، فيمكنك بناء HashSet<string> (وهو أساسا ما أتوقع أن يفعل متميز تحت غطاء محرك السيارة، ولكن Distinct() من الواضح أن تعيد قيم جديدة لأنها تجدها، والحفاظ على النظام.

في الواقع، فقط باستخدام:

HashSet<string> distinctItems = new HashSet<string>(list);

سيكون حل جيد جدا (وبسيط) إذا كنت لا تمانع في صائزة الطلب. انها أبسط من استخدام Dictionary, ، نظافة من النظافة كذلك (كما أنت لا تفعل ذلك هل حقا تريد تعيين مفاتيح للقيم).

(كما كان أي وقت مضى، أود أن أقترح العثور على الحل الأكثر قراءة أولا، ومعياره - إذا كان "سريع بما فيه الكفاية"، ثم الذهاب مع ذلك. إذا كنت ترغب في استخدام هذا كجزء من استفسار آخر، ثم Distinct قد يكون كذلك الطريقة الأكثر قراءة. خلاف ذلك، أود أن أقترح HashSet.)

نصائح أخرى

سأذهب شخصيا مع الطريقة المتميزة () المقدمة من LinQ. من الأسهل بكثير القراءة والصيانة. أثناء استخدام LinQ أبطأ من استخدام قاموس، سيكون الفرق صغيرا (في حالة سرد) وسوف تكون أفضل قضاء بعض الوقت في تحسين استعلامات قاعدة البيانات أو مكالمات خدمة الويب.

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

إذا كانت قابلية القراءة مصدر قلق، فقم بإنشاء GetDistinctItems الطريقة ووضع التعليمات البرمجية الخاصة بك داخلها: Voilà، التعليمات البرمجية الموثقة ذاتيا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top