سؤال

لا أحد يعرف إذا كان هناك ما يعادل جافا Set جمع في C# ؟ وأنا أعلم أنك يمكن أن تحاكي إلى حد ما مجموعة باستخدام Dictionary أو HashTable عن طريق ملء لكن تجاهل القيم ، ولكن هذا ليس وسيلة أنيقة جدا.

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

المحلول

HashSet :

<اقتباس فقرة>   

ووHashSet (وT) على الطبقة عمليات مجموعة عالية الأداء. وهناك مجموعة هي المجموعة التي لا تحتوي على عناصر مكررة، وعناصره هي في أي ترتيب معين ...

     

وقدرة على HashSet (وT) الكائن هو عدد من العناصر التي يمكن للكائن عقد. A HashSet (وT) قدرة الكائن يزيد تلقائيا كما يتم إضافة عناصر إلى كائن.

     

ويستند HashSet (وT) فئة على غرار مجموعات الرياضية وتوفر عمليات مجموعة عالية الأداء مماثلة لالوصول إلى مفاتيح في قاموس (وTKey، TValue) أو <وأ href =" https://msdn.microsoft.com/en-us/library/system.collections. hashtable.aspx "يختلط =" noreferrer "> مجموعات جدول هاش. بعبارات بسيطة، وHashSet (وT) فئة يمكن التفكير فيه باعتباره قاموس ( من TKey، TValue) جمع دون القيم.

     

وA HashSet (وT) لا يتم فرز جمع ولا يمكن أن تحتوي عناصر مكررة ...

نصائح أخرى

على HashSet<T> هيكل البيانات:

إطار فئة المكتبة HashSet<T> بنية بيانات في العمل .NET Framework 3.5.قائمة كاملة من أعضائها يمكن العثور عليها في MSDN المرجعية الصفحة HashSet<T>.

HashSet<T> هو أكثر أو أقل على غرار مجموعة الرياضي, مما يعني أن:

  1. قد لا تحتوي على قيم مكررة.

  2. عناصرها هي في أي ترتيب معين ؛ ولذلك لا تنفذ IList<T> واجهة, ولكن أكثر الأساسية ICollection<T>.ونتيجة لذلك ، عناصر داخل تجزئة مجموعة لا يمكن أن يكون عشوائيا الوصول إليها من خلال المؤشرات ؛ لا يمكن إلا أن يتحرك أكثر من خلال العداد.

  3. بعض الوظائف مثل Union, Intersection, IsSubsetOf, IsSupersetOf تتوفر.هذه يمكن أن تأتي في متناول اليدين عند العمل مع مجموعات متعددة.

وثمة فرق آخر بين HashSet<T> و List<T> أن الدعوة تجزئة مجموعة Add(item) الأسلوب بإرجاع قيمة منطقية: true إذا كان هذا البند تم إضافتها ، false وإلا (لأنه كان بالفعل وجدت في مجموعة).

لماذا لا List<T>?

منذ HashSet<T> هو ببساطة عبارة عن مجموعة من الكائنات الفريدة ، قد نتساءل لماذا يجب أن يكون بنية البيانات.عادي List<T> يمكن أن يكون نفس السلوك عن طريق التحقق من إذا كان يتم العثور على كائن في القائمة قبل إضافته.

الجواب القصير هو السرعة.البحث من خلال طبيعي List<T> يحصل بطيئة جدا جدا بسرعة أكثر العناصر المضافة.A HashSet<T> يتطلب تصميم هيكل تسمح البحث السريع و الإدراج بسرعة.

المعايير:

دعونا نقارن أداء سرعة HashSet<T> مقابلa List<T>.

كل محاكمة يتكون من إضافة الأعداد الصحيحة من 0 إلى 9,999 إلى كل مجموعة.بيد أن وزارة الدفاع 25 على كل عدد صحيح.وزارة الدفاع 25 يجعل أقصى أنواع العناصر 25.منذ 10,000 أضيفت عناصر هذا القسري 400 التصادمات تحدث ، وإعطاء هياكل البيانات فرصة استخدام خوارزميات البحث.مرات تم قياس 3 مرات بعد 10,000 محاكمات متوسط.

لا تدفع الكثير من الاهتمام محددة تشغيل مرات من الاختبارات لأنها تعتمد على الأجهزة ، لكن انظر كيف يقارن بعضها البعض.

           Average time [ms]
----------------------------
HashSet<T>             2,290
List<T>                5,505

الآن دعونا جعل عناصر الكائنات بدلا من أنواع بدائية.كتبت سريعة Person فئة مع ثلاثة حقول: Name, LastName, ، ID.وبما أنني لم تشمل أي طريقة محددة لمقارنة الأشياء ، جميع العناصر ستضاف دون اصطدام.هذا الوقت من 1000 Person الكائنات أضيفت إلى جمع كل واحد المحاكمة.إجمالي مرات من 3 مجموعات من 1000 المحاكمات متوسط.

           Average time [ms]
----------------------------
HashSet<Person>          201
List<Person>           3,000

كما يمكنك أن ترى الفرق في تشغيل مرات يصبح الفلكية عند استخدام الكائنات ، مما يجعل HashSet<T> من المفيد.

إذا كنت تستخدم .NET 4.0 أو في وقت لاحق:

في حالة حيث كنت في حاجة الفرز ثم استخدام SortedSet<T>.وإلا إذا لم يكن ثم استخدام HashSet<T> لأنه O(1) للبحث و التعامل مع العمليات.في حين SortedSet<T> هو O(log n) للبحث و التعامل مع العمليات.

وأنا استخدم Iesi.Collections http://www.codeproject.com/KB/recipes /sets.aspx

وانها تستخدم في الكثير من المشاريع OSS، جئت لاول مرة عبر ذلك في NHibernate

ويمكنني استخدام المجمع حول Dictionary<T, object>، تخزين القيم الخالية في القيم. وهذا يعطي O (1) إضافة، بحث وإزالة على مفاتيح، وإلى جميع المقاصد والأغراض يتصرف مثل مجموعة.

وإلقاء نظرة على PowerCollections في أكثر من كود بلاكس. وبصرف النظر عن تعيين وOrderedSet لديها عدد قليل من الأنواع الأخرى جمع مفيدة مثل صف مزدوج الذيل، MultiDictionary، حقيبة، OrderedBag، OrderedDictionary وOrderedMultiDictionary.

لمزيد من المجموعات، وهناك أيضا rel="noreferrer"> .

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

public class UniqueList<T> : List<T>
{
    public new void Add(T obj)
    {
        if(!Contains(obj))
        {
            base.Add(obj);
        }
    }
}

ولأن قائمة تستخدم طريقة يساوي فقط لتحديد المساواة، يمكنك تحديد طريقة يساوي على نوع T للتأكد من حصولك على النتائج المرجوة.

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