Dictionary实现

Posted elijah-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dictionary实现相关的知识,希望对你有一定的参考价值。

https://www.cnblogs.com/xiaomowang/p/12405639.html

上述网址写的很详细

先从entry开始说起:

这是一个结构体(包含 哈希值,下一个entry的地址,键值,数值啊)

1.初始化

       private void Initialize(int capacity) {
            int size = HashHelpers.GetPrime(capacity);
            buckets = new int[size];
            for (int i = 0; i < buckets.Length; i++) buckets[i] = -1;
            entries = new Entry[size];
            freeList = -1;
        }

 


HashHelper.cs
public static int GetPrime(int min) 
{
  if (min < 0) throw new ArgumentException(Environment.GetResourceString("Arg_HTCapacityOverflow")); Contract.EndContractBlock(); for (int i = 0; i < primes.Length; i++) { int prime = primes[i]; if (prime >= min) return prime; } //outside of our predefined table. //compute the hard way. for (int i = (min | 1); i < Int32.MaxValue;i+=2) { if (IsPrime(i) && ((i - 1) % Hashtable.HashPrime != 0)) return i; } return min; }

public static bool IsPrime(int candidate)
{
  if ((candidate & 1) != 0)//不是0
  {

    int limit = (int)Math.Sqrt(candidate);
    for (int divisor = 3; divisor <= limit; divisor += 2)
    {
      if ((candidate % divisor) == 0)
        return false;
    }
    return true;
  }
  return (candidate == 2);
}

 

2.插入(修改ASDCD)

int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;
int targetBucket = hashCode % buckets.Length;
//根据这个(targetBucket)在buckets中找到对应数组并遍历这个根据entry中的next看看是不是已经有值了(替换)
//如果没有对应位置获取entries中第一个空的位置并添加上,如果已经满了,增加容量并重新初始化

3.删除

根据hashcode生成的bucket找到entries,。在对应entries中找到对应值然后置空

4.查找

4.1 下标查找也是根据ashcode生成的bucket找到entries然后遍历entries

5.遍历

遍历数组entries















以上是关于Dictionary实现的主要内容,如果未能解决你的问题,请参考以下文章

WPF使用HierarchicalDataTemplate绑定Dictionary生成TreeView

WPF使用HierarchicalDataTemplate绑定Dictionary生成TreeView

JavaScript中创建字典对象(dictionary)实例

浅析C# Dictionary实现原理

DotNet Dictionary 实现简介

高薪面试必备:浅析C# Dictionary实现原理