سؤال

سؤال قديم

ما أفهمه هو أن C# له معنى إلى حد ما HashSet و set أنواع.أنا أفهم ماذا HashSet يكون.لكن لماذا set هي كلمة منفصلة؟لماذا ليس كل مجموعة HashSet<Object>?

سؤال جديد

لماذا لا يحتوي C# على عام Set اكتب ، على غرار Dictionary يكتب؟من وجهة نظري، أرغب في الحصول على مجموعة ذات أداء قياسي للبحث/الإضافة/الحذف.لا أهتم كثيرًا بما إذا كان قد تم تحقيقه باستخدام التجزئة أو أي شيء آخر.فلماذا لا ننشئ فئة محددة يمكن تنفيذها فعليًا كـ HashSet في هذا الإصدار من C# ولكن ربما يختلف بعض الشيء في الإصدار المستقبلي؟

أو لماذا لا واجهة على الأقل ISet?

إجابة

تعلمت شكرا لكل من أجاب أدناه: ICollection ينفذ الكثير مما تتوقعه منه ISet.لكن من وجهة نظري، ICollection ينفذ IEnumerable بينما لا يجب أن تكون المجموعات قابلة للتعداد --- مثال:مجموعة من الأعداد الحقيقية بين 1 و 2 (وأكثر من ذلك، يمكن إنشاء المجموعات ديناميكيًا).أوافق على أن هذا مجرد صراخ بسيط، حيث أن "المبرمجين العاديين" نادرًا ما يحتاجون إلى مجموعات لا تعد ولا تحصى.

حسنًا، أعتقد أنني فهمت الأمر. HashSet كان من المفترض أن يتم استدعاؤه على الإطلاق Set لكن الكلمة Set محجوز إلى حد ما.وبشكل أكثر تحديدًا، أراد منشئو بنية .NET الحصول على مجموعة متسقة (هكذا!) من الفئات للغات المختلفة.وهذا يعني أن كل اسم للفئة القياسية يجب ألا يتطابق مع أي كلمة رئيسية في لغات .NET.الكلمة Set, ومع ذلك، يتم استخدامه في VB.NET وهو في الواقع غير حساس لحالة الأحرف (أليس كذلك؟) لذا لسوء الحظ لا يوجد مجال للمناورة هناك.

الغموض حل :)

الخاتمة

الإجابة الجديدة من Alex Y.روابط إلى صفحة MSDN الذي يصف واجهة .NET 4.0 القادمة ISet الذي يتصرف إلى حد كبير كما اعتقدت أنه ينبغي أن ينفذ بواسطة HashedSet.نهاية سعيدة.

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

المحلول

(سؤالك الأصلي حول set تم الرد.IIRC، "set" هي الكلمة ذات المعاني الأكثر اختلافًا في اللغة الإنجليزية...ومن الواضح أن هذا له تأثير في الحوسبة أيضًا.)

أعتقد أنه من الجيد أن يكون لديك HashSet<T> بهذا الاسم، لكنني بالتأكيد أرحب بـ ISet<T> واجهه المستخدم.بشرط HashSet<T> وصلت فقط إلى .NET 3.5 (وهو ما كان مفاجئًا في حد ذاته) وأظن أننا قد نحصل في النهاية على مجموعة أكثر اكتمالاً من الأنواع القائمة على المجموعة.على وجه الخصوص، ما يعادل جافا LinkedHashSet, ، الذي يحافظ على ترتيب الإدراج، قد يكون مفيدًا في بعض الحالات.

ولكي نكون منصفين، فإن ICollection<T> تغطي الواجهة في الواقع معظم ما تريده ISet<T>, ، لذلك ربما لا يكون ذلك مطلوبًا.ومع ذلك، يمكنك القول بأن الغرض الأساسي للمجموعة (الذي يدور في الغالب حول الاحتواء، وبشكل عرضي فقط حول القدرة على التكرار على العناصر) ليس تمامًا مثل المجموعة.انها صعبة.

وبالمثل ، فإن فكرة "إضافة" إلى مجموعة لا معنى لها دائمًا.تعد قابلية التغيير عملاً صعبًا عند تسمية المجموعات :(

يحرر:حسنًا ، الرد على التعليق:الكلمة الرئيسية set ليس بأي حال من الأحوال إرثًا يتعلق بـ Visual Basic.إنها العملية التي مجموعات قيمة العقار مقابل get أيّ يسترد العملية.هذا لا علاقة له بفكرة المجموعة كعملية.

تخيل أنه بدلا من ذلك كانت الكلمات الرئيسية في الواقع fetch و assign, ، على سبيل المثال.

// Not real code!
public int Foo
{
    fetch
    {
        return fooField;
    } 
    assign
    {
        fooField = value;
    } 
}

هل الهدف واضح هناك؟الآن حقيقي ما يعادل ذلك في C# هو مجرد

public int Foo
{
    get
    {
        return fooField;
    } 
    set
    {
        fooField = value;
    } 
}

لذلك إذا كتبت:

x = y.Foo;

التي سوف تستخدم get جزء من الممتلكات.إذا كتبت:

y.Foo = x;

التي سوف تستخدم set جزء.

فهل هذا أكثر وضوحا؟

نصائح أخرى

لا يوجد مجموعة<T>.هذا منشور مدونة فريق BCL يحتوي على الكثير من التفاصيل حول HashSet بما في ذلك مناقشة غير حاسمة تمامًا حول تضمين التجزئة في الاسم.أظن أن الجميع في فريق BCL لم يعجبهم قرار استخدام اسم HashSet<T>.

يبدو أن السبب الوحيد لذلك هو نقص الموارد اللازمة لتنفيذ ذلك بشكل مثالي في .NET 3.5.

سوف يشمل .NET 4.0 أضبط, ، فضلا عن تنفيذه الجديد بالإضافة إلى HashSet - SortedSet.تحقق من الارتباطات المتوفرة لمكتبة MSDN - فهي متوفرة بالفعل في .NET 4.0 beta1.

set هي كلمة أساسية بلغة C# موجودة منذ الإصدار 1.0.يتم استخدامه لتحديد جزء تعيين القيمة للخاصية (و get يستخدم لتنفيذ جزء قراءة القيمة من الممتلكات).في هذا السياق يجب أن تفهم كلمة "set" كفعل، كما هو الحال في تحديد القيمة.

HashSet<T> هو تطبيق خاص للمفهوم الرياضي للمجموعة.تم تقديمه لأول مرة في .NET 3.5.يشرح منشور المدونة هذا الذي نشره فريق BCL المزيد حول السبب الكامن وراء ذلك، بالإضافة إلى بعض الأدلة حول سبب تسمية الاسم HashSet<T> وليس فقط Set<T>: http://blogs.msdn.com/bclteam/archive/2006/11/09/introducing-hashset-t-kim-hamilton.aspx.

في حالة HashSet<T> يجب أن تفهم كلمة "مجموعة" كاسم.

Set هي كلمة رئيسية محجوزة في VB.NET (وهي تعادل Set في C#).يمكن لـ VB.NET استخدام الفئات/الطرق/إلخ بنفس اسم الكلمات الرئيسية ولكن يجب كتابتها بين قوسين مربعين، وهو أمر قبيح:

Imports Wintellect.PowerCollections 'PowerCollections contains a class called Set'
Public Class Test
    Private _myValue As Integer  

    Public Property MyValue() As Integer
        Get
            Return _myValue
        End Get
        Set ' Set as keyword'
            _myValue = value
        End Set
    End Property

    Public Function X As [Set](Of Integer)
        Dim a As New [Set](Of Integer) ' Set as class'
        Return a
    End Function

End Class

اه صحيح فهمت سؤالك الآن
لست متأكدًا من أنني أستطيع رؤية الحاجة إلى 100٪ ISet<T>.
أعتقد أن السؤال هو ما هو السلوك الذي تعتبره أساسيًا للمجموعة؟
هل هو إضافة أو إزالة أو يحتوي على إلخ.إذا كان الأمر كذلك ICollection<T> يوفر بالفعل واجهة لذلك.
إذا تم تعيين عمليات مثل Union وIntersect وما إلى ذلك، فهل هذا شيء قد تعتبره عامًا بدرجة كافية لاستخلاصه من إنفاذ نمط العقد؟

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

المشاركة الأصلية

لا تحتوي BCL على مجموعة Set على الإطلاق، على الأقل ليس بقدر ما أعرف.
هناك عدد قليل من مجموعة libs التابعة لجهات خارجية مثل Iesi.Collections
HashSet<T> تم تقديمه في .NET 3.5 لإنشاء مجموعة سريعة الإعداد، أي حيث تريد مجموعة بدون تكرارات.كما أن لديها عمليات مجموعة نموذجية مثل Union وJoin.الدفع هذا الرابط من فريق BCL على HashSet

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

بعض التفاصيل الإضافية:
ميزة أخرى لطيفة في HashSet هي أنها لا تطرح استثناءً إذا حاولت إضافة نسخة مكررة، ولكنها تفشل فقط في إضافة الإدخال المكرر مما يوفر عليك الحاجة إلى وضع الكثير من كتل Try.catch حول كل إضافة - جميل :)

أنا متأكد من عدم وجود ذلك Set<T> فئة في BCL، على الأقل في .NET 3.5 (وليس .NET 4.0 أيضًا على ما يبدو).ما الذي تتوقعه هو الحاجة لمثل هذه الفئة، على أي حال؟

HashSet<T> هي في حد ذاتها مجرد بنية بيانات عادية تستخدم رموز التجزئة (ملف GetHashCode طريقة كائن) لمقارنة العناصر.هذه ببساطة طريقة فعالة لتنفيذ نوع المجموعة.(من المرجح أن يكون للأساليب الأخرى للتحقق من المساواة أداء أقل).

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