سؤال

هل يمكنك توضيح ما هو الفرق بين HashSet<T> و List<T> في الشباك؟

ربما يمكنك أن توضح بمثال في أي الحالات HashSet<T> يجب أن يفضل ضد List<T> ?

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

المحلول

بخلاف القائمة <> ...

  1. HashSet هي قائمة ليس بها أعضاء مكررون.

  2. نظرًا لأن HashSet مقيد لاحتواء إدخالات فريدة فقط ، فقد تم تحسين البنية الداخلية للبحث (مقارنة بالقائمة) - فهي أسرع إلى حد كبير

  3. تؤدي الإضافة إلى HashSet إلى إرجاع قيمة منطقية - خطأ إذا فشلت عملية الإضافة بسبب وجودها بالفعل في المجموعة

  4. يمكنه إجراء عمليات حسابية على مجموعة: Union / Intersection / IsSubsetOf وما إلى ذلك

  5. لا تقوم HashSet بتطبيق IList فقط ICollection

  6. لا يمكنك استخدام المؤشرات مع HashSet ، فقط العدادين.

سيكون السبب الرئيسي لاستخدام HashSet إذا كنت مهتمًا بإجراء عمليات Set.

إعطاء مجموعتين: hashSet1 و hashSet2

Genacodicetagpre

يطير بالمقارنة مع عملية مماثلة باستخدام LINQ.من الأفضل أيضًا أن تكتب!

نصائح أخرى

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

رمز الترقيم العام عبارة عن فئة مصممة لمنحك مجموعة ذات وصول عشوائي لرمز الشفرة العامة يمكن أن تنمو بشكل ديناميكي (فكر في المصفوفة الديناميكية).يمكنك اختبار الاحتواء في وقت الترميز العام (ما لم يتم فرز القائمة ، يمكنك إجراء بحث ثنائي في وقت الترميز العام).

ربما يمكنك التوضيح بمثال في الحالات التي يجب فيها تفضيل رمز الترقيم العام مقابل رمز الترقيم العام

عندما تريد اختبار الاحتواء في الكود الترميزي العام.

لكي نكون أكثر دقة دعونا نوضح مع الأمثلة،

لا يمكنك استخدام HashSet كما في المثال التالي.

HashSet<string> hashSet1 = new HashSet<string>(){"1","2","3"};
for (int i = 0; i < hashSet1.Count; i++)
    Console.WriteLine(hashSet1[i]);

hashSet1[i] سوف ينتج خطأ:

لا يمكن تطبيق الفهرسة مع [] على تعبير عن النوع "system.collections.generic.hashset"

يمكنك استخدام عبارة foreach :

foreach (var item in hashSet1)
    Console.WriteLine(item);

لا يمكنك إضافة عناصر مكررة إلى hashset بينما تتيح لك القائمة القيام بذلك ، وبينما تقوم بإضافة عنصر إلى hashset ، يمكنك التحقق من أنه يحتوي على العنصر أم لا.

HashSet<string> hashSet1 = new HashSet<string>(){"1","2","3"};
if (hashSet1.Add("1"))
   Console.WriteLine("'1' is successfully added to hashSet1!");
else
   Console.WriteLine("'1' could not be added to hashSet1, because it contains '1'");

يحتوي HashSet على بعض الوظائف المفيدة مثل IntersectWith, UnionWith, IsProperSubsetOf, ExceptWith, SymmetricExceptWith إلخ.

IsProperSubsetOf:

HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "4" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" };
HashSet<string> hashSet3 = new HashSet<string>() { "1", "2", "3", "4", "5" };
if (hashSet1.IsProperSubsetOf(hashSet3))
    Console.WriteLine("hashSet3 contains all elements of hashSet1.");
if (!hashSet1.IsProperSubsetOf(hashSet2))
    Console.WriteLine("hashSet2 does not contains all elements of hashSet1.");

UnionWith:

HashSet<string> hashSet1 = new HashSet<string>() { "3", "4" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" };
hashSet1.UnionWith(hashSet2); //hashSet1 -> 3, 2, 4, 6, 8

IntersectWith:

HashSet<string> hashSet1 = new HashSet<string>() { "3", "4", "8" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" }
hashSet1.IntersectWith(hashSet2);//hashSet1 -> 4, 8

ExceptWith :

 HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "5", "6" };
 HashSet<string> hashSet2 = new HashSet<string>() { "1", "2", "3", "4" };
 hashSet1.ExceptWith(hashSet2);//hashSet1 -> 5, 6

SymmetricExceptWith :

 HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "5", "6" };
 HashSet<string> hashSet2 = new HashSet<string>() { "1", "2", "3", "4" };
 hashSet1.SymmetricExceptWith(hashSet2);//hashSet1 -> 4, 5, 6

بالمناسبة، لا يتم حفظ الطلب في HashSets.في المثال، أضفنا العنصر "2" أخيرًا ولكنه في الترتيب الثاني:

HashSet<string> hashSet1 = new HashSet<string>() { "3", "4", "8" };
hashSet1.Add("1");    // 3, 4, 8, 1
hashSet1.Remove("4"); // 3, 8, 1
hashSet1.Add("2");    // 3, 2 ,8, 1

إستخدم List<T> عندما تريد:

  • تخزين مجموعة من العناصر بترتيب معين.

إذا كنت تعرف فهرس العنصر الذي تريده (بدلاً من قيمة العنصر نفسه)، فإن الاسترجاع يكون O(1).إذا كنت لا تعرف الفهرس، فإن العثور على العنصر سيستغرق وقتًا أطول، O(n) لمجموعة غير مصنفة.

إستخدم Hashset<T> عندما تريد:

  • اكتشف بسرعة ما إذا كان هناك كائن معين موجود في المجموعة.

إذا كنت تعرف اسم الشيء الذي تريد البحث عنه، فالبحث هو O(1) (هذا هو الجزء "التجزئة").لا يحافظ على ترتيب مثل List<T> لا يمكنك تخزين التكرارات (إضافة نسخة مكررة ليس له أي تأثير، وهذا هو الجزء "Set").

مثال على متى يتم استخدام أ Hashset<T> سيكون ذلك إذا كنت تريد معرفة ما إذا كانت الكلمة التي يتم لعبها في لعبة Scrabble هي كلمة صالحة باللغة الإنجليزية (أو لغة أخرى).سيكون من الأفضل أن ترغب في إنشاء خدمة ويب لتستخدمها جميع مثيلات الإصدار عبر الإنترنت من هذه اللعبة.

أ List<T> ستكون بنية بيانات جيدة لإنشاء لوحة النتائج لتتبع نتائج اللاعبين.

القائمة هي قائمة مرتبة.إنه

  • الوصول إليها من خلال فهرس عدد صحيح
  • يمكن أن يحتوي على تكرارات
  • له ترتيب يمكن التنبؤ به

HashSet هي مجموعة.هو:

  • يمكنه حظر العناصر المكررة (راجع إضافة (T) )
  • لا يضمن ترتيب العناصر داخل المجموعة
  • لديه عمليات تتوقعها على مجموعة ، على سبيل المثال ، IntersectWith ، IsProperSubsetOf ، UnionWith.

تعد القائمة أكثر ملاءمة عندما تريد الوصول إلى مجموعتك كما لو كانت مثل مصفوفة يمكنك إلحاق العناصر وإدراجها وإزالتها.يعد HashSet خيارًا أفضل إذا كنت تريد معاملة مجموعتك مثل "حقيبة" من العناصر التي لا يكون ترتيبها مهمًا أو عندما تريد مقارنتها بمجموعات أخرى باستخدام عمليات مثل IntersectWith أو UnionWith.

ليست القائمة فريدة بالضرورة ، في حين أن التجزئة هي واحدة.

القائمة هي مجموعة مرتبة من الكائنات من النوع T والتي على عكس المصفوفة ، يمكنك إضافة الإدخالات وإزالتها.

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

إن HashSet مثل القاموس أن العنصر نفسه هو المفتاح بالإضافة إلى القيمة ، فالطلب غير مضمون.

يمكنك استخدام HashSet حيث تريد التحقق من وجود كائن في المجموعة

إذا قررت تطبيق هياكل البيانات هذه على الاستخدام الفعلي في التطوير المستند إلى البيانات ، فإن HashSet مفيدة جدًا في اختبار النسخ المتماثل مقابل مصادر محول البيانات ، لتنقية البيانات وترحيلها.

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

يتمثل أحد الخيارات القوية لاستخدام القائمة في تنفيذ الأدوية العامة لعدة وسائط في نموذج العرض ، مثل إرسال قائمة بالفئات إلى عرض MVC لمساعد القائمة المنسدلة ، وكذلك للإرسال كإنشاء JSON عبر WebApi.تسمح القائمة بمنطق تجميع الفئة النموذجي ، وتحافظ على المرونة للحصول على "واجهة" مثل أسلوب حساب نموذج عرض واحد إلى وسائط مختلفة.

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