\u76ee\u5f55<\/span><\/span><\/p> \n \u3000\u3000\u672c\u6587\u662f\u5bf9c#\u4e2dDictionary\u5185\u90e8\u5b9e\u73b0\u539f\u7406\u8fdb\u884c\u7b80\u5355\u7684\u5256\u6790\u3002\u5982\u6709\u8868\u8ff0\u9519\u8bef\uff0c\u6b22\u8fce\u6307\u6b63\u3002<\/span><\/span><\/p> \n \u3000\u3000\u4e3b\u8981\u5bf9\u7167\u6e90\u7801\u6765\u89e3\u6790\uff0c\u76ee\u524d\u5bf9\u7167\u6e90\u7801\u7684\u7248\u672c\u662f.Net Framwork 4.8\uff0c<\/strong>\u6e90\u7801\u5730\u5740<\/a>\u3002<\/span><\/p> \n 1. \u5173\u952e\u7684\u5b57\u6bb5\u548cEntry\u7ed3\u6784<\/span><\/strong><\/p> \n 2. \u6dfb\u52a0\u952e\u503c\uff08Add\uff09<\/span><\/strong><\/p> \n \n
struct<\/span> Entry\r\n {\r\n <\/span>public<\/span> int<\/span> hashCode; \/\/<\/span> key\u7684hashCode & 0x7FFFFFFF<\/span>\r\n public<\/span> int<\/span> next; \/\/<\/span> \u6307\u5411\u94fe\u8868\u4e0b\u4e00\u4e2a\u5143\u7d20\u7684\u5730\u5740\uff08\u5b9e\u9645\u5c31\u662fentries\u7684\u7d22\u5f15\uff09\uff0c\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u4e3a-1<\/span>\r\n public<\/span> TKey key;\r\n <\/span>public<\/span> TValue value;\r\n }\r\n Entry[] entries; <\/span>\/\/<\/span>\u5b58\u653e\u952e\u503c<\/span>\r\n int<\/span>[] buckets; \/\/<\/span>\u5b58\u50a8entries\u6700\u65b0\u5143\u7d20\u7684\u7d22\u5f15,\u5176\u5b58\u50a8\u4f4d\u7f6e\u7531\u53d6\u6a21\u7ed3\u679c\u51b3\u5b9a\u3002\u4f8b\uff1a\u5047\u8bbe\u952e\u503c\u5b58\u50a8\u5728entries\u7684\u7b2c1\u5143\u7d20\u7684\u4f4d\u7f6e\u4e0a\uff0c\u4e14hashCode\u548c\u957f\u5ea6\u7684\u53d6\u6a21\u7ed3\u679c\u4e3a2\uff0c\u90a3\u4e48buckets[2] = 1<\/span>\r\n int<\/span> count = 0<\/span>; \/\/<\/span>\u5df2\u5b58\u50a8\u952e\u503c\u7684\u4e2a\u6570<\/span>\r\n int<\/span> version; \/\/<\/span>\u8bb0\u5f55\u7248\u672c\uff0c\u9632\u6b62\u8fed\u4ee3\u8fc7\u7a0b\u4e2d\u96c6\u5408\u88ab\u66f4\u6539<\/span>\r\n IEqualityComparer<TKey> _comparer; \r\n <\/span>int<\/span> freeList; \/\/<\/span>entries\u4e2d\u6700\u65b0\u7a7a\u5143\u7d20\u7684\u7d22\u5f15<\/span>\r\n int<\/span> freeCount; \/\/<\/span>entries\u4e2d\u7a7a\u5143\u7d20\u7684\u4e2a\u6570<\/span><\/pre> \n <\/div> \n
public<\/span> void<\/span> Add(TKey key, TValue value) {\r\n Insert(key, value, <\/span>true<\/span>);\r\n }\r\n\r\n\r\n <\/span>private<\/span> void<\/span> Insert(TKey key, TValue value, bool<\/span> add) {\r\n \r\n <\/span>if<\/span>( key == null<\/span> ) {\r\n ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);\r\n }\r\n <\/span>if<\/span> (buckets == null<\/span>) Initialize(0<\/span>);\r\n <\/span>int<\/span> hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF<\/span>;\r\n <\/span>\/\/<\/span>\u53d6\u6a21<\/span>\r\n int<\/span> targetBucket = hashCode % buckets.Length;\r\n<\/span>#if<\/span> FEATURE_RANDOMIZED_STRING_HASHING\r\n int<\/span> collisionCount = 0<\/span>;\r\n<\/span>#endif<\/span>\r\n for<\/span> (int<\/span> i = buckets[targetBucket]; i >= 0<\/span>; i = entries[i].next) {\r\n <\/span>if<\/span> (entries[i].hashCode == hashCode && comparer.Equals(entries[i].key, key)) {\r\n <\/span>if<\/span> (add) {\r\n ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);\r\n }\r\n <\/span>\/\/<\/span>\u5bf9\u4e8e\u5df2\u5b58\u5728\u7684Key\u91cd\u65b0\u8d4b\u503c<\/span>\r\n entries[i].value = value;\r\n version<\/span>++;\r\n <\/span>return<\/span>;\r\n }\r\n<\/span>#if<\/span> FEATURE_RANDOMIZED_STRING_HASHING\r\n collisionCount<\/span>++;\r\n<\/span>#endif<\/span>\r\n }\r\n <\/span>int<\/span> index;\r\n <\/span>if<\/span> (freeCount > 0<\/span>) {\r\n <\/span>\/\/<\/span>\u5b58\u5728entries\u4e2d\u5b58\u5728\u7a7a\u5143\u7d20<\/span>\r\n index = freeList;\r\n freeList <\/span>= entries[index].next;\r\n freeCount<\/span>--;\r\n }\r\n <\/span>else<\/span> {\r\n <\/span>if<\/span> (count == entries.Length)\r\n {\r\n <\/span>\/\/<\/span>\u6269\u5bb9\uff1a\u53d6\u5927\u4e8ecount * 2\u7684\u6700\u5c0f\u7d20\u6570\u4f5c\u4e3aentries\u548cbucket\u7684\u65b0\u5bb9\u91cf\uff08\u5373\u6570\u7ec4\u957f\u5ea6.Length\uff09<\/span>\r\n Resize();\r\n targetBucket <\/span>= hashCode % buckets.Length;\r\n }\r\n index <\/span>= count;\r\n count<\/span>++;\r\n }\r\n entries[index].hashCode <\/span>= hashCode;\r\n entries[index].next <\/span>= buckets[targetBucket];\r\n entries[index].key <\/span>= key;\r\n entries[index].value <\/span>= value;\r\n <\/span>\/\/<\/span>\u5b58\u53d6\u94fe\u8868\u7684\u5934\u5143\u7d20\u7684\u7d22\u5f15\uff08\u5373entries\u6700\u540e\u5b58\u5165\u7684\u5143\u7d20\u7684\u5728enties\u4e2d\u7684\u7d22\u5f15\uff09\r\n <\/span>\/\/<\/span>\u4fbf\u4e8e\u53d6Key\u7684\u65f6\u6bcf\u6b21\u4ece\u94fe\u8868\u7684\u5934\u5143\u7d20\u5f00\u59cb\u904d\u5386\uff0c\u8be6\u7ec6\u89c1FindEntry(TKey key)\u51fd\u6570<\/span>\r\n buckets[targetBucket] = index;\r\n version<\/span>++;\r\n<\/span>#if<\/span> FEATURE_RANDOMIZED_STRING_HASHING\r\n#if<\/span> FEATURE_CORECLR\r\n \/\/<\/span> In case we hit the collision threshold we'll need to switch to the comparer which is using randomized string hashing\r\n <\/span>\/\/<\/span> in this case will be EqualityComparer<string>.Default.\r\n <\/span>\/\/<\/span> Note, randomized string hashing is turned on by default on coreclr so EqualityComparer<string>.Default will\r\n <\/span>\/\/<\/span> be using randomized string hashing<\/span>\r\n if<\/span> (collisionCount > HashHelpers.HashCollisionThreshold && comparer == NonRandomizedStringEqualityComparer.Default)\r\n {\r\n comparer <\/span>= (IEqualityComparer<TKey>) EqualityComparer<string<\/span>>.Default;\r\n Resize(entries.Length, <\/span>true<\/span>);\r\n }\r\n<\/span>#else<\/span>\r\n if<\/span>(collisionCount > HashHelpers.HashCollisionThreshold && HashHelpers.IsWellKnownEqualityComparer(comparer))\r\n {\r\n <\/span>\/\/<\/span>\u5982\u679c\u78b0\u649e\u6b21\u6570\uff08\u5355\u94fe\u8868\u957f\u5ea6\uff09\u5927\u4e8e\u8bbe\u7f6e\u7684\u6700\u5927\u78b0\u649e\u9608\u503c\uff0c\u9700\u8981\u6269\u5bb9<\/span>\r\n comparer = (IEqualityComparer<TKey>) HashHelpers.GetRandomizedEqualityComparer(comparer);\r\n Resize(entries.Length, <\/span>true<\/span>);\r\n }\r\n<\/span>#endif<\/span> \/\/<\/span> FEATURE_CORECLR<\/span>\r\n#endif<\/span>\r\n }\r\n\r\n<\/span>****************************************************************************************************************************","orderid":"0","title":"\u4e00\u6b65\u4e00\u6b65\u5256\u6790Dictionary\u5b9e\u73b0\u539f\u7406(\u4e00)","smalltitle":"","mid":"0","fname":".NET","special_id":"0","bak_id":"0","info":"0","hits":"591","pages":"4","comments":"0","posttime":"2019-10-11 11:20:01","list":"1570764001","username":"admin","author":"","copyfrom":"","copyfromurl":"","titlecolor":"","fonttype":"0","titleicon":"0","picurl":"https:\/\/www.cppentry.com\/upload_files\/","ispic":"0","yz":"1","yzer":"","yztime":"0","levels":"0","levelstime":"0","keywords":"\u6b65\u4e00\u6b65<\/A> \u5256\u6790<\/A> Dictionary<\/A> \u5b9e\u73b0<\/A> \u539f\u7406<\/A>","jumpurl":"","iframeurl":"","style":"","template":"a:3:{s:4:\"head\";s:0:\"\";s:4:\"foot\";s:0:\"\";s:8:\"bencandy\";s:0:\"\";}","target":"0","ip":"14.17.22.32","lastfid":"0","money":"0","buyuser":"","passwd":"","allowdown":"","allowview":"","editer":"","edittime":"0","begintime":"0","endtime":"0","description":"\u4e00\u6b65\u4e00\u6b65\u5256\u6790Dictionary\u5b9e\u73b0\u539f\u7406","lastview":"1716081972","digg_num":"0","digg_time":"0","forbidcomment":"0","ifvote":"0","heart":"","htmlname":"","city_id":"0"},"page":"1"}