ما هو مثال على التنفيذ القابل للتصنيف في C#؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

أدرك أن C# و .NET بشكل عام لديه بالفعل فصول التصنيف والقاموس.

هل يمكن لأي شخص أن يظهر في C# تنفيذ علامة تصنيف؟

تحديث: لتوضيح ، لا أبحث عن تطبيق كامل ، مجرد مثال على الميزات الأساسية للهاوية (أي إضافة ، إزالة ، البحث عن طريق المفتاح).

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

المحلول

هناك أيضًا نسخة أحادية من مكتبات الفصل بالطبع:

نصائح أخرى

بعد فترة طويلة من طرح السؤال ، لذلك لا أتوقع أن أحصل على الكثير من الممثلين. ومع ذلك ، قررت أنه سيكون من الممتع أن أكتب مثالي الأساسي للغاية (في أقل من 90 سطرًا من التعليمات البرمجية):

    public struct KeyValue<K, V>
    {
        public K Key { get; set; }
        public V Value { get; set; }
    }

    public class FixedSizeGenericHashTable<K,V>
    {
        private readonly int size;
        private readonly LinkedList<KeyValue<K,V>>[] items;

        public FixedSizeGenericHashTable(int size)
        {
            this.size = size;
            items = new LinkedList<KeyValue<K,V>>[size];
        }

        protected int GetArrayPosition(K key)
        {
            int position = key.GetHashCode() % size;
            return Math.Abs(position);
        }

        public V Find(K key)
        {
            int position = GetArrayPosition(key);
            LinkedList<KeyValue<K, V>> linkedList = GetLinkedList(position);
            foreach (KeyValue<K,V> item in linkedList)
            {
                if (item.Key.Equals(key))
                {
                    return item.Value;
                }
            }

            return default(V);
        }

        public void Add(K key, V value)
        {
            int position = GetArrayPosition(key);
            LinkedList<KeyValue<K, V>> linkedList = GetLinkedList(position);
            KeyValue<K, V> item = new KeyValue<K, V>() { Key = key, Value = value };
            linkedList.AddLast(item);
        }

        public void Remove(K key)
        {
            int position = GetArrayPosition(key);
            LinkedList<KeyValue<K, V>> linkedList = GetLinkedList(position);
            bool itemFound = false;
            KeyValue<K, V> foundItem = default(KeyValue<K, V>);
            foreach (KeyValue<K,V> item in linkedList)
            {
                if (item.Key.Equals(key))
                {
                    itemFound = true;
                    foundItem = item;
                }
            }

            if (itemFound)
            {
                linkedList.Remove(foundItem);
            }
        }

        protected LinkedList<KeyValue<K, V>> GetLinkedList(int position)
        {
            LinkedList<KeyValue<K, V>> linkedList = items[position];
            if (linkedList == null)
            {
                linkedList = new LinkedList<KeyValue<K, V>>();
                items[position] = linkedList;
            }

            return linkedList;
        }
    }

إليك تطبيق اختبار صغير:

 static void Main(string[] args)
        {
            FixedSizeGenericHashTable<string, string> hash = new FixedSizeGenericHashTable<string, string>(20);

            hash.Add("1", "item 1");
            hash.Add("2", "item 2");
            hash.Add("dsfdsdsd", "sadsadsadsad");

            string one = hash.Find("1");
            string two = hash.Find("2");
            string dsfdsdsd = hash.Find("dsfdsdsd");
            hash.Remove("1");
            Console.ReadLine();
        }

إنه ليس أفضل تطبيق ، لكنه يعمل من أجل إضافة وإزالة وإيجاد. يستخدم التسلسل وخوارزمية Modulo بسيطة للعثور على الدلو المناسب.

هل نظرت إلى مجموعات C5؟ تستطيع قم بتنزيل المصدر والذي يتضمن جدول التجزئة.

يمكنك أن ترى كيف يتم تنفيذ علامة التجزئة .NET (على سبيل المثال في C#) باستخدام العاكس

http://www.red-gate.com/products/reflector/

يمكنك عرض "النمو" البسيط فقط هنا, ، والتي يجب أن تعطيك فكرة عن تطبيق بسيط.

إخلاء المسئولية: ربما يكون هناك بعض الأخطاء في الكود ، لكن المبدأ هو نفسه :)

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