亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#創建安全的字典(Dictionary)存儲結構

2019-10-29 21:17:51
字體:
來源:轉載
供稿:網友

在上面介紹過棧(Stack)的存儲結構,接下來介紹另一種存儲結構字典(Dictionary)。 字典(Dictionary)里面的每一個元素都是一個鍵值對(由二個元素組成:鍵和值) 鍵必須是唯一的,而值不需要唯一的,鍵和值都可以是任何類型。字典(Dictionary)是常用于查找和排序的列表。

  接下來看一下Dictionary的部分方法和類的底層實現代碼:

  1.Add:將指定的鍵和值添加到字典中。

  public void Add(TKey key, TValue value) {      Insert(key, value, true);     } private void Insert(TKey key, TValue value, bool add) {       if( key == null ) {         ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);      }       if (buckets == null) Initialize(0);      int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;      int targetBucket = hashCode % buckets.Length; #if FEATURE_RANDOMIZED_STRING_HASHING       int collisionCount = 0; #endif      for (int i = buckets[targetBucket]; i >= 0; i = entries[i].next) {        if (entries[i].hashCode == hashCode && comparer.Equals(entries[i].key, key)) {          if (add) {            ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);           }          entries[i].value = value;           version++;           return;        } #if FEATURE_RANDOMIZED_STRING_HASHING        collisionCount++;#endif       }      int index;       if (freeCount > 0) {         index = freeList;        freeList = entries[index].next;         freeCount--;      }      else {        if (count == entries.Length)         {          Resize();           targetBucket = hashCode % buckets.Length;         }        index = count;         count++;      }      entries[index].hashCode = hashCode;       entries[index].next = buckets[targetBucket];      entries[index].key = key;       entries[index].value = value;       buckets[targetBucket] = index;      version++; #if FEATURE_RANDOMIZED_STRING_HASHING      if(collisionCount > HashHelpers.HashCollisionThreshold && HashHelpers.IsWellKnownEqualityComparer(comparer))      {         comparer = (IEqualityComparer<TKey>) HashHelpers.GetRandomizedEqualityComparer(comparer);        Resize(entries.Length, true);       } #endif    }

  2.Clear():從 Dictionary<TKey, TValue> 中移除所有的鍵和值。

 public void Clear() {      if (count > 0) {        for (int i = 0; i < buckets.Length; i++) buckets[i] = -1;        Array.Clear(entries, 0, count);         freeList = -1;        count = 0;         freeCount = 0;         version++;      }     }

   3.Remove():從 Dictionary<TKey, TValue> 中移除所指定的鍵的值。

 public bool Remove(TKey key) {      if(key == null) {        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);      }       if (buckets != null) {         int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;         int bucket = hashCode % buckets.Length;        int last = -1;         for (int i = buckets[bucket]; i >= 0; last = i, i = entries[i].next) {          if (entries[i].hashCode == hashCode && comparer.Equals(entries[i].key, key)) {            if (last < 0) {              buckets[bucket] = entries[i].next;             }            else {               entries[last].next = entries[i].next;             }            entries[i].hashCode = -1;             entries[i].next = freeList;            entries[i].key = default(TKey);            entries[i].value = default(TValue);            freeList = i;             freeCount++;            version++;             return true;           }        }       }      return false;    }

 

  4.GetEnumerator():返回循環訪問 Dictionary<TKey, TValue> 的枚舉器。

  public Enumerator GetEnumerator() {      return new Enumerator(this, Enumerator.KeyValuePair);     } [Serializable]     public struct Enumerator: IEnumerator<KeyValuePair<TKey,TValue>>,      IDictionaryEnumerator     {       private Dictionary<TKey,TValue> dictionary;      private int version;       private int index;      private KeyValuePair<TKey,TValue> current;      private int getEnumeratorRetType; // What should Enumerator.Current return?      internal const int DictEntry = 1;      internal const int KeyValuePair = 2;       internal Enumerator(Dictionary<TKey,TValue> dictionary, int getEnumeratorRetType) {        this.dictionary = dictionary;         version = dictionary.version;        index = 0;        this.getEnumeratorRetType = getEnumeratorRetType;        current = new KeyValuePair<TKey, TValue>();       }      public bool MoveNext() {         if (version != dictionary.version) {          ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);         }        // Use unsigned comparison since we set index to dictionary.count+1 when the enumeration ends.        // dictionary.count+1 could be negative if dictionary.count is Int32.MaxValue         while ((uint)index < (uint)dictionary.count) {          if (dictionary.entries[index].hashCode >= 0) {             current = new KeyValuePair<TKey, TValue>(dictionary.entries[index].key, dictionary.entries[index].value);             index++;            return true;           }          index++;        }        index = dictionary.count + 1;        current = new KeyValuePair<TKey, TValue>();         return false;       }      public KeyValuePair<TKey,TValue> Current {        get { return current; }      }      public void Dispose() {      }       object IEnumerator.Current {        get {           if( index == 0 || (index == dictionary.count + 1)) {            ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumOpCantHappen);          }          if (getEnumeratorRetType == DictEntry) {            return new System.Collections.DictionaryEntry(current.Key, current.Value);           } else {             return new KeyValuePair<TKey, TValue>(current.Key, current.Value);          }         }      }      void IEnumerator.Reset() {         if (version != dictionary.version) {          ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);         }         index = 0;         current = new KeyValuePair<TKey, TValue>();      }      DictionaryEntry IDictionaryEnumerator.Entry {         get {          if( index == 0 || (index == dictionary.count + 1)) {              ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumOpCantHappen);           }          return new DictionaryEntry(current.Key, current.Value);        }      }      object IDictionaryEnumerator.Key {        get {           if( index == 0 || (index == dictionary.count + 1)) {              ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumOpCantHappen);          }           return current.Key;        }      }       object IDictionaryEnumerator.Value {         get {           if( index == 0 || (index == dictionary.count + 1)) {             ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumOpCantHappen);           }          return current.Value;        }       }    }

     上面主要是對字典(Dictionary)的一些常用方法進行一個簡單的說明。接下來主要闡述如何創建安全的字典(Dictionary)存儲結構。有關線程安全的部分,在這里就不再贅述了。

  /// <summary>  /// 線程安全通用字典  /// </summary>  /// <typeparam name="TKey"></typeparam>  /// <typeparam name="TValue"></typeparam>  public class TDictionary<TKey, TValue> : IDictionary<TKey, TValue>  {    /// <summary>    /// 鎖定字典    /// </summary>    private readonly ReaderWriterLockSlim _lockDictionary = new ReaderWriterLockSlim();    /// <summary>    ///基本字典    /// </summary>    private readonly Dictionary<TKey, TValue> _mDictionary;    // Variables    /// <summary>    /// 初始化字典對象    /// </summary>    public TDictionary()    {      _mDictionary = new Dictionary<TKey, TValue>();    }    /// <summary>    /// 初始化字典對象    /// </summary>    /// <param name="capacity">字典的初始容量</param>    public TDictionary(int capacity)    {      _mDictionary = new Dictionary<TKey, TValue>(capacity);    }    /// <summary>    ///初始化字典對象    /// </summary>    /// <param name="comparer">比較器在比較鍵時使用</param>    public TDictionary(IEqualityComparer<TKey> comparer)    {      _mDictionary = new Dictionary<TKey, TValue>(comparer);    }    /// <summary>    /// 初始化字典對象    /// </summary>    /// <param name="dictionary">其鍵和值被復制到此對象的字典</param>    public TDictionary(IDictionary<TKey, TValue> dictionary)    {      _mDictionary = new Dictionary<TKey, TValue>(dictionary);    }    /// <summary>    ///初始化字典對象    /// </summary>    /// <param name="capacity">字典的初始容量</param>    /// <param name="comparer">比較器在比較鍵時使用</param>    public TDictionary(int capacity, IEqualityComparer<TKey> comparer)    {      _mDictionary = new Dictionary<TKey, TValue>(capacity, comparer);    }    /// <summary>    /// 初始化字典對象    /// </summary>    /// <param name="dictionary">其鍵和值被復制到此對象的字典</param>    /// <param name="comparer">比較器在比較鍵時使用</param>    public TDictionary(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer)    {      _mDictionary = new Dictionary<TKey, TValue>(dictionary, comparer);    }    public TValue GetValueAddIfNotExist(TKey key, Func<TValue> func)    {      return _lockDictionary.PerformUsingUpgradeableReadLock(() =>      {        TValue rVal;        // 如果我們有值,得到它并退出        if (_mDictionary.TryGetValue(key, out rVal))          return rVal;        // 沒有找到,所以做函數得到的值        _lockDictionary.PerformUsingWriteLock(() =>        {          rVal = func.Invoke();          // 添加到字典          _mDictionary.Add(key, rVal);          return rVal;        });        return rVal;      });    }    /// <summary>    /// 將項目添加到字典    /// </summary>    /// <param name="key">添加的關鍵</param>    /// <param name="value">要添加的值</param>    public void Add(TKey key, TValue value)    {      _lockDictionary.PerformUsingWriteLock(() => _mDictionary.Add(key, value));    }    /// <summary>    ///將項目添加到字典    /// </summary>    /// <param name="item">要添加的鍵/值</param>    public void Add(KeyValuePair<TKey, TValue> item)    {      var key = item.Key;      var value = item.Value;      _lockDictionary.PerformUsingWriteLock(() => _mDictionary.Add(key, value));    }    /// <summary>    /// 如果值不存在,則添加該值。 返回如果值已添加,則為true    /// </summary>    /// <param name="key">檢查的關鍵,添加</param>    /// <param name="value">如果鍵不存在,則添加的值</param>    public bool AddIfNotExists(TKey key, TValue value)    {      bool rVal = false;      _lockDictionary.PerformUsingWriteLock(() =>      {        // 如果不存在,則添加它        if (!_mDictionary.ContainsKey(key))        {          // 添加該值并設置標志          _mDictionary.Add(key, value);          rVal = true;        }      });      return rVal;    }    /// <summary>    /// 如果鍵不存在,則添加值列表。    /// </summary>    /// <param name="keys">要檢查的鍵,添加</param>    /// <param name="defaultValue">如果鍵不存在,則添加的值</param>    public void AddIfNotExists(IEnumerable<TKey> keys, TValue defaultValue)    {      _lockDictionary.PerformUsingWriteLock(() =>      {        foreach (TKey key in keys)        {          // 如果不存在,則添加它          if (!_mDictionary.ContainsKey(key))            _mDictionary.Add(key, defaultValue);        }      });    }    public bool AddIfNotExistsElseUpdate(TKey key, TValue value)    {      var rVal = false;      _lockDictionary.PerformUsingWriteLock(() =>      {        // 如果不存在,則添加它        if (!_mDictionary.ContainsKey(key))        {          // 添加該值并設置標志          _mDictionary.Add(key, value);          rVal = true;        }        else          _mDictionary[key] = value;      });      return rVal;    }    /// <summary>    /// 如果鍵存在,則更新鍵的值。    /// </summary>    /// <param name="key"></param>    /// <param name="newValue"></param>    public bool UpdateValueIfKeyExists(TKey key, TValue newValue)    {      bool rVal = false;      _lockDictionary.PerformUsingWriteLock(() =>      {        // 如果我們有密鑰,然后更新它        if (!_mDictionary.ContainsKey(key)) return;        _mDictionary[key] = newValue;        rVal = true;      });      return rVal;    }    /// <summary>    /// 如果鍵值對存在于字典中,則返回true    /// </summary>    /// <param name="item">鍵值對查找</param>    public bool Contains(KeyValuePair<TKey, TValue> item)    {      return _lockDictionary.PerformUsingReadLock(() => ((_mDictionary.ContainsKey(item.Key)) &&                               (_mDictionary.ContainsValue(item.Value))));    }    public bool ContainsKey(TKey key)    {      return _lockDictionary.PerformUsingReadLock(() => _mDictionary.ContainsKey(key));    }    /// <summary>    /// 如果字典包含此值,則返回true    /// </summary>    /// <param name="value">找到的值</param>    public bool ContainsValue(TValue value)    {      return _lockDictionary.PerformUsingReadLock(() => _mDictionary.ContainsValue(value));    }    public ICollection<TKey> Keys    {      get { return _lockDictionary.PerformUsingReadLock(() => _mDictionary.Keys); }    }    public bool Remove(TKey key)    {      return _lockDictionary.PerformUsingWriteLock(() => (!_mDictionary.ContainsKey(key)) || _mDictionary.Remove(key));    }    public bool Remove(KeyValuePair<TKey, TValue> item)    {      return _lockDictionary.PerformUsingWriteLock(() =>      {        // 如果鍵不存在則跳過        TValue tempVal;        if (!_mDictionary.TryGetValue(item.Key, out tempVal))          return false;        //如果值不匹配,請跳過        return tempVal.Equals(item.Value) && _mDictionary.Remove(item.Key);      });    }    /// <summary>    /// 從字典中刪除與模式匹配的項    /// </summary>    /// <param name="predKey">基于鍵的可選表達式</param>    /// <param name="predValue">基于值的選項表達式</param>    public bool Remove(Predicate<TKey> predKey, Predicate<TValue> predValue)    {      return _lockDictionary.PerformUsingWriteLock(() =>      {        // 如果沒有鍵退出        if (_mDictionary.Keys.Count == 0)          return true;        //保存要刪除的項目列表        var deleteList = new List<TKey>();        // 過程密鑰        foreach (var key in _mDictionary.Keys)        {          var isMatch = false;          if (predKey != null)            isMatch = (predKey(key));          // 如果此項目的值匹配,請添加它          if ((!isMatch) && (predValue != null) && (predValue(_mDictionary[key])))            isMatch = true;          // 如果我們有匹配,添加到列表          if (isMatch)            deleteList.Add(key);        }        // 從列表中刪除所有項目        foreach (var item in deleteList)          _mDictionary.Remove(item);        return true;      });    }    public bool TryGetValue(TKey key, out TValue value)    {      _lockDictionary.EnterReadLock();      try      {        return _mDictionary.TryGetValue(key, out value);      }      finally      {        _lockDictionary.ExitReadLock();      }    }    public ICollection<TValue> Values    {      get { return _lockDictionary.PerformUsingReadLock(() => _mDictionary.Values); }    }    public TValue this[TKey key]    {      get { return _lockDictionary.PerformUsingReadLock(() => _mDictionary[key]); }      set { _lockDictionary.PerformUsingWriteLock(() => _mDictionary[key] = value); }    }    /// <summary>    /// 清除字典    /// </summary>    public void Clear()    {      _lockDictionary.PerformUsingWriteLock(() => _mDictionary.Clear());    }    public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)    {      _lockDictionary.PerformUsingReadLock(() => _mDictionary.ToArray().CopyTo(array, arrayIndex));    }    /// <summary>    /// 返回字典中的項目數    /// </summary>    public int Count    {      get { return _lockDictionary.PerformUsingReadLock(() => _mDictionary.Count); }    }    public bool IsReadOnly    {      get { return false; }    }    public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()    {      Dictionary<TKey, TValue> localDict = null;      _lockDictionary.PerformUsingReadLock(() => localDict = new Dictionary<TKey, TValue>(_mDictionary));      return ((IEnumerable<KeyValuePair<TKey, TValue>>)localDict).GetEnumerator();    }    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()    {      Dictionary<TKey, TValue> localDict = null;      _lockDictionary.PerformUsingReadLock(() => localDict = new Dictionary<TKey, TValue>(_mDictionary));      return localDict.GetEnumerator();    }  }

    以上創建安全的字典方法中,主要對字典的一些方法和屬性進行重寫操作,對某些方法進行鎖設置。

    以上就是本文的全部內容,希望對大家有所幫助,同時也希望多多支持VEVB武林網!


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲男人第一网站| 亚洲新中文字幕| 欧美日韩在线影院| 九九视频这里只有精品| 欧美综合国产精品久久丁香| 日韩视频免费大全中文字幕| 国产亚洲精品久久久久久| 欧美成人一区二区三区电影| 一个人看的www久久| 欧美黑人又粗大| 欧美国产日韩一区二区三区| 亚洲爱爱爱爱爱| 日本免费久久高清视频| 国产亚洲欧美日韩精品| 992tv成人免费视频| 日韩av中文字幕在线免费观看| 欧美一区二区三区艳史| 亚洲午夜精品视频| 国产一区二区av| 国产精品久久久久av| 欧美性极品xxxx娇小| 欧美在线视频免费播放| 国产成人亚洲综合| 亚洲欧美日韩在线高清直播| 欧美一乱一性一交一视频| 国产精品中文字幕在线| 国产精品最新在线观看| 国产精品精品久久久| 国产精品稀缺呦系列在线| 亚洲欧美999| 亚洲精品视频免费| 精品久久久久久久大神国产| 亚洲国产精品电影| 国产成人精品在线视频| 亚洲精品永久免费精品| 欧美黑人巨大xxx极品| 国产亚洲欧美日韩精品| 欧美另类69精品久久久久9999| 按摩亚洲人久久| 91精品国产高清自在线看超| 精品无人区太爽高潮在线播放| 国产精品日日摸夜夜添夜夜av| 中文字幕日韩欧美在线| 欧美在线精品免播放器视频| 国产精品成人观看视频国产奇米| 777国产偷窥盗摄精品视频| 欧美成人午夜视频| 欧美日韩国产va另类| 欧美裸体xxxx极品少妇| 国产精品精品视频一区二区三区| 性色av一区二区三区在线观看| 久久成人综合视频| 色综合91久久精品中文字幕| 日韩中文字幕在线精品| 中文字幕精品视频| 国语自产在线不卡| 国产日韩欧美91| 亚洲女人天堂色在线7777| 91网站免费看| 国产精品观看在线亚洲人成网| 欧美国产日本高清在线| 久久国产精品久久国产精品| 国产亚洲成精品久久| 久久久久久久久久久网站| 国产精品夫妻激情| 欧美极度另类性三渗透| 国产精品免费一区豆花| 欧美性受xxxx黑人猛交| 成人综合国产精品| 成人在线观看视频网站| 黄色成人av在线| 色噜噜国产精品视频一区二区| 久久伊人91精品综合网站| 91久久精品国产91性色| 亚洲а∨天堂久久精品9966| 26uuu另类亚洲欧美日本一| 久久这里只有精品视频首页| 国产欧美精品久久久| 久久精品一本久久99精品| 国产精品电影观看| 亚洲性线免费观看视频成熟| 久久久久女教师免费一区| 欧美成人免费网| 亚洲视屏在线播放| 国产精品久久久久久久久久三级| 国产一区二区黑人欧美xxxx| 精品成人av一区| 亚洲综合自拍一区| 精品亚洲一区二区三区四区五区| 国产精品高清免费在线观看| 夜夜躁日日躁狠狠久久88av| 欧美成人剧情片在线观看| 亚洲精品按摩视频| 中文.日本.精品| 国产亚洲精品一区二555| 美女av一区二区三区| 在线观看日韩专区| 538国产精品一区二区在线| 亚洲人a成www在线影院| 日韩福利伦理影院免费| 国产欧美日韩中文| 亚洲在线免费观看| 亚洲精品91美女久久久久久久| 欧美一级免费视频| 成人黄在线观看| 丝袜亚洲欧美日韩综合| 欧美激情二区三区| 国模视频一区二区三区| 亚洲日本aⅴ片在线观看香蕉| 一个人看的www欧美| 国产91露脸中文字幕在线| 69视频在线免费观看| 亚洲人成电影在线观看天堂色| 国产精品久久久久久网站| 国产成人a亚洲精品| 18一19gay欧美视频网站| 国产精品青青在线观看爽香蕉| 欧美电影在线观看| 国产精品久久久久久久久久东京| 成人欧美在线观看| 久久天天躁狠狠躁老女人| 97免费中文视频在线观看| 亚洲奶大毛多的老太婆| 国产精品黄页免费高清在线观看| 久久久精品一区二区| 欧美情侣性视频| 2025国产精品视频| 欧美一二三视频| 大桥未久av一区二区三区| 日韩av免费在线播放| 亚洲一区二区中文| 不卡在线观看电视剧完整版| 日韩免费av在线| 亚洲精品网址在线观看| 欧美日韩精品中文字幕| 日韩成人在线观看| 精品亚洲国产视频| 91av在线不卡| 国产成人精品电影久久久| 亚洲一区国产精品| 亚洲国产成人av在线| 国产成人免费av电影| 91免费看国产| 国产日韩中文字幕| 久久理论片午夜琪琪电影网| 91av在线播放视频| 日韩经典第一页| 亚洲精品国产综合久久| 精品福利在线观看| 欧美激情区在线播放| 5566日本婷婷色中文字幕97| 亚洲欧洲免费视频| 中文日韩电影网站| 日韩视频免费在线| 国产激情久久久| 色99之美女主播在线视频| 欧美精品成人91久久久久久久| 亚洲精品一区二区在线| 蜜臀久久99精品久久久无需会员| 亚洲国产成人av在线| 日本一区二三区好的精华液| 最新国产精品亚洲| 中文字幕亚洲综合久久筱田步美| 欧美成人激情图片网|