C # හි හැෂ්ටේබල් වලට වඩා ශබ්ද කෝෂය වඩාත් කැමති ඇයි?


1405

බොහෝ ක්‍රමලේඛන භාෂාවල, හැෂ් ටේබල් වලට වඩා ශබ්ද කෝෂ වඩාත් කැමති වේ. ඊට හේතු මොනවාද?


21
> මෙය අනිවාර්යයෙන්ම සත්‍ය නොවේ. හැෂ් වගුවක් යනු ශබ්ද කෝෂයක් ක්‍රියාත්මක කිරීමයි. එය සාමාන්‍ය එකක් වන අතර එය .NET හි පෙරනිමිය විය හැකි නමුත් එය අර්ථ දැක්වීම අනුව එකම එකක් නොවේ. මෙය ECMA ප්‍රමිතියට අවශ්‍ය බව මට විශ්වාස නැත, නමුත් MSDN ප්‍රලේඛනය ඉතා පැහැදිලිවම එය හැෂ් ටේබල් එකක් ලෙස ක්‍රියාත්මක කරන බව කියා සිටී. විකල්පයක් වඩාත් සාධාරණ වන අවස්ථා සඳහා ඔවුන් SortedList පන්තිය පවා සපයයි.
Promit

15
Ro ප්‍රොමිට් මම නිතරම සිතුවේ Dictionaryඑය ක්‍රියාත්මක කිරීමක් බවයි Hashtable.
b1nary.atr0phy

2
මම හිතන්නේ හේතුව, ශබ්දකෝෂයක යතුර වර්ගය සහ ඔබේ විකුණුම් සඳහා වටිනාකම නිර්වචනය කළ හැකිය. Hashtable හට වස්තූන් පමණක් ගෙන හැෂ් මත පදනම්ව යුගල සුරකිනු ඇත (object.GetHashCode () වෙතින්).
රේඩිනේටර්

2
An ඔබගේ හිමිකම් පෑම වැරදියි ... හැෂ් වගුවක අඩංගු වන්නේ එක් එක් යතුරේ එක් අවස්ථාවක් පමණි, සෙවුමකින් කිසි විටෙකත් බහු ඇතුළත් කිරීම් නොලැබේ; ඔබට එක් එක් යතුර සමඟ බහුවිධ අගයන් ඇසුරු කිරීමට අවශ්‍ය නම්, හැෂ් වගුවේ අගය වටිනාකම් ලැයිස්තුවක් බවට පත් කරන්න. “ශබ්දකෝෂයක්” වැනි දත්ත ව්‍යුහයක් නොමැත ... ශබ්දකෝෂය යනු සමහර පුස්තකාල ඔවුන්ගේ හැෂ් වගුව සඳහා භාවිතා කරන නමයි. උදා: C # හි සාමාන්‍ය නොවන හැෂ් වගුව හැඳින්වේ HashTable. ඔවුන් භාෂාවට ජනකතා එකතු කළ විට ඔවුන් හැඳින්වූයේ සාමාන්‍ය අනුවාදයයි Dictionary. දෙකම හැෂ් වගු ය.
ජිම් බෝල්ටර්

3
An ඔබගේ ප්‍රකාශය වැරදියි ... හැෂ් වගුවක් ( en.wikipedia.org/wiki/Hash_table ) යනු ශබ්දකෝෂයක විශේෂිත ක්‍රියාත්මක කිරීමකි, එනම් සහායක අරා ( en.wikipedia.org/wiki/Associative_array ), සහ, ශබ්දකෝෂයක, එක් එක් යතුරේ එක් අවස්ථාවක් පමණක් අඩංගු වන අතර සෙවුමකින් කිසි විටෙකත් බහු ඇතුළත් කිරීම් නොලැබේ; ඔබට එක් එක් යතුර සමඟ බහුවිධ අගයන් ඇසුරු කිරීමට අවශ්‍ය නම්, හැෂ් වගුවේ අගය වටිනාකම් ලැයිස්තුවක් බවට පත් කරන්න. .NET ශබ්දකෝෂය සහ හැෂ්ටබල් පන්ති දෙකම හැෂ් වගු වේ.
ජිම් බෝල්ටර්

Answers:


1577

එය වටින දේ සඳහා, ශබ්දකෝෂයක් යනු (සංකල්පමය වශයෙන්) හැෂ් වගුවකි.

ඔබ අදහස් කළේ "අපි Dictionary<TKey, TValue>පන්තිය වෙනුවට පන්තිය භාවිතා කරන්නේ ඇයි Hashtable?", එවිට එය පහසු පිළිතුරකි: Dictionary<TKey, TValue>සාමාන්‍ය වර්ගයකි, Hashtableඑසේ නොවේ. එයින් අදහස් කරන්නේ ඔබට Dictionary<TKey, TValue>අහඹු වස්තුවක් එයට ඇතුළු කළ නොහැකි නිසාත්, ඔබ විසින් ගන්නා ලද අගයන් ඉවත දැමිය යුතු නැති නිසාත්, ඔබ සමඟ ආරක්‍ෂාව ලබා ගැනීමයි .

Dictionary<TKey, TValue>.NET රාමුව තුළ ක්‍රියාත්මක කිරීම පදනම් වී ඇත්තේ සිත්ගන්නා කරුණකි, මෙම විවරණයෙන් Hashtableඔබට එහි ප්‍රභව කේතයෙන් පැවසිය හැකිය:

සාමාන්‍ය ශබ්දකෝෂය පිටපත් කරන ලද්දේ හැෂ්ටේබල්ගේ ප්‍රභවයෙන් ය

මූලාශ්රය


395
බොක්සිං / බොක්සිං නොමැති බැවින් සාමාන්‍ය එකතු කිරීම් වේගවත් වේ
ක්‍රිස් එස්

6
ඉහත ප්‍රකාශය සමඟ හැෂ්ටේබල් එකක් ගැන විශ්වාස නැත, නමුත් අරේලිස්ට් එදිරිව ලැයිස්තුව <t> සඳහා එය සත්‍යයකි
ක්‍රිස් එස්

36
හැෂ්ටබල් විසින් අභ්‍යන්තරව දේවල් රඳවා තබා ගැනීම සඳහා වස්තුව භාවිතා කරයි (එය කිරීමට සාමාන්‍ය නොවන ක්‍රමයක් පමණි) එබැවින් එයට කොටු / අගුළු දැමිය යුතුය.
ග්වාන්ටේ

16
Rian බ්‍රයන් ජේ: “හැෂ් මේසයක්” (වචන දෙකක්) යනු මේ ආකාරයේ ව්‍යුහයක් සඳහා වන පරිගණක විද්‍යා පදයයි; ශබ්දකෝෂය නිශ්චිත ක්‍රියාත්මක කිරීමකි. හැෂ් ටේබල් දළ වශයෙන් ශබ්ද කෝෂයකට <වස්තුව, වස්තුව> (තරමක් වෙනස් අතුරුමුහුණත් සහිතව) අනුරූප වේ, නමුත් දෙකම හැෂ් වගු සංකල්පය ක්‍රියාත්මක කිරීමකි. ඇත්ත වශයෙන්ම, කාරණා තවදුරටත් ව්‍යාකූල කිරීම සඳහා, සමහර භාෂා ඔවුන්ගේ හැෂ් වගු “ශබ්ද කෝෂ” (උදා: පයිතන්) ලෙස හැඳින්වේ - නමුත් නිසි CS පදය තවමත් හැෂ් වගුවයි.
මයිකල් මැඩ්සන්

32
@BrianJ: දෙකම HashTable(පන්ති) සහ Dictionary(පන්ති) එහි පූරක වගු (සංකල්පය) ඇත, නමුත් HashTableඑය නොවේ Dictionary, වත් වේ Dictionaryඑය HashTable. ඒවා ඉතා සමාන විලාසිතාවන්හි භාවිතා වන අතර, Dictionary<Object,Object>එය HashTableසිදු නොකරන ආකාරයටම ක්‍රියා කළ හැකි නමුත් ඒවා කිසිදු කේතයක් කෙලින්ම බෙදා නොගනී (කොටස් ඉතා සමාන ආකාරයකින් ක්‍රියාත්මක වීමට ඉඩ ඇතත්).
මයිකල් මැඩ්සන්

628

Dictionary<<< >>> Hashtableවෙනස්කම්:

  • සාමාන්‍ය <<< >>> සාමාන්‍ය නොවන
  • අවශ්‍යතා තමන්ගේම නූල් සමමුහුර්තකරණය <<< >>> ක්‍රමය හරහා නූල් ආරක්ෂිත අනුවාදය ලබා දෙයිSynchronized()
  • ගණනය කළ අයිතමය: KeyValuePair<<< >>> ගණන් කළ අයිතමය:DictionaryEntry
  • නවතම (> .NET 2.0 ) <<< >>> පැරණි ( .NET 1.0 සිට )
  • System.Collections.Generic <<< >>> වේ System.Collections
  • නොපවතින යතුර සඳහා ඉල්ලීම ව්‍යතිරේකය <<< >>> නොපවතින යතුරු ප්‍රතිලාභ සඳහා ඉල්ලීම ශුන්‍ය වේ
  • අගය වර්ග සඳහා ටිකක් වේගවත් විය හැක <<< >>> අගය වර්ග සඳහා ටිකක් මන්දගාමී (බොක්සිං / අන්බොක්සිං අවශ්‍යයි)

Dictionary/ Hashtableසමානකම්:

  • දෙකම අභ්‍යන්තරව හැෂ් ටේබල් == යතුර අනුව බොහෝ අයිතම දත්ත වෙත වේගයෙන් ප්‍රවේශ වීම
  • දෙකම වෙනස් කළ නොහැකි හා අද්විතීය යතුරු අවශ්‍යයි
  • දෙකෙහිම යතුරු වලට තමන්ගේම GetHashCode()ක්‍රමයක් අවශ්‍ය වේ

සමාන .නෙට් එකතු කිරීම් (ශබ්ද කෝෂය සහ හැෂ්ටබල් වෙනුවට භාවිතා කිරීමට අපේක්ෂකයින්):

  • ConcurrentDictionary- නූල් ආරක්ෂිතයි (සමගාමීව නූල් කිහිපයකින් ආරක්ෂිතව ප්‍රවේශ විය හැකිය)
  • HybridDictionary- ප්‍රශස්ත කාර්ය සාධනය (අයිතම කිහිපයක් සඳහා සහ බොහෝ අයිතම සඳහා)
  • OrderedDictionary- අගයන් int දර්ශකය හරහා ප්‍රවේශ කළ හැකිය (අයිතම එකතු කළ අනුපිළිවෙල අනුව)
  • SortedDictionary- අයිතම ස්වයංක්‍රීයව වර්ග කර ඇත
  • StringDictionary- තදින් ටයිප් කර නූල් සඳහා ප්‍රශස්තිකරණය කර ඇත

11
@ Guillaume86, මේ නිසා ඔබ tryGetValue වෙනුවට msdn.microsoft.com/en-us/library/bb347013.aspx
ට්‍රයිඩන්ට්

2
+1 සඳහා StringDictionary... btw ඔබ පෙරනිමි ඉදිකිරීම්කරු භාවිතා StringDictionaryකරන Dictionary<string, string>විට සමාන නොවේ .
චෙං චෙන්

ParallelExtensionsExtras @ code.msdn.microsoft.com/windowsdesktop/… හි නිරීක්‍ෂණය කළ හැකි සමගාමී ශබ්දකෝෂයක් අඩංගු වන අතර එය විශිෂ්ට බැඳීම් මෙන්ම සමගාමී මුදල් වේ.
VoteCoffee

3
පුදුමාකාර පැහැදිලි කිරීමක්, කෙනෙකුගේ මනසට
නැඟිය


179

නිසා Dictionary(අ Generic බලපත්රය යටතේ අවසර ලබා ඇත පන්තිය යි Dictionary<TKey, TValue>එහි අන්තර්ගතය ප්රවේශ වර්ගය-ආරක්ෂිත (ඔබ කාස්ට් කිරීමට අවශ්ය නොවන, එනම්, එසේ බව,) Objectඔබ සමග මෙන්, Hashtable).

සසඳන්න

var customers = new Dictionary<string, Customer>();
...
Customer customer = customers["Ali G"];

වෙත

var customers = new Hashtable();
...
Customer customer = customers["Ali G"] as Customer;

කෙසේ වෙතත්, Dictionaryඅභ්‍යන්තරව හැෂ් වගුව ලෙස ක්‍රියාත්මක වන බැවින් තාක්ෂණික වශයෙන් එය එකම ආකාරයකින් ක්‍රියාත්මක වේ.


89

FYI: .NET හි, Hashtableබහු පා er ක නූල් සහ තනි ලිවීමේ නූල් භාවිතා කිරීම සඳහා නූල් ආරක්ෂිත වන අතර, Dictionaryපොදු ස්ථිතික සාමාජිකයන් තුළ නූල් ආරක්ෂිත වේ, නමුත් ඕනෑම අවස්ථාවක සාමාජිකයින්ට නූල් ආරක්ෂිත බව සහතික නොවේ.

මේ නිසා අපට අපගේ සියලුම ශබ්ද කෝෂ නැවත වෙනස් කිරීමට සිදුවිය Hashtable.


10
විනෝද. ශබ්ද කෝෂය <T> ප්‍රභව කේතය වඩා පිරිසිදු හා වේගවත් බව පෙනේ. ශබ්ද කෝෂය භාවිතා කිරීම සහ ඔබේම සමමුහුර්තකරණය ක්‍රියාත්මක කිරීම වඩා හොඳ විය හැකිය. ශබ්ද කෝෂය කියවීම නියත වශයෙන්ම වත්මන් විය යුතු නම්, ඔබට ශබ්ද කෝෂයේ කියවීමේ / ලිවීමේ ක්‍රම වෙත ප්‍රවේශය සමමුහුර්ත කළ යුතුය. එය විශාල අගුලු දැමීමක් වනු ඇත, නමුත් එය නිවැරදි වනු ඇත.
ට්‍රයින්කෝ

10
විකල්පයක් ලෙස, ඔබේ කියවීම් නිරපේක්ෂව තිබිය යුතු නොවේ නම්, ඔබට ශබ්ද කෝෂය වෙනස් කළ නොහැකි ලෙස සැලකිය හැකිය. එවිට ඔබට ශබ්දකෝෂය වෙත යොමු කිරීමක් ලබා ගත හැකි අතර කියවීම් කිසිසේත්ම සමමුහුර්ත නොකිරීමෙන් කාර්ය සාධනය ලබා ගත හැකිය (එය වෙනස් කළ නොහැකි සහ සහජයෙන්ම නූල්-ආරක්ෂිත බැවින්). එය යාවත්කාලීන කිරීම සඳහා, ඔබ පසුබිමේ ශබ්දකෝෂයේ සම්පූර්ණ යාවත්කාලීන කළ පිටපතක් ගොඩනඟා, පසුව ඉන්ටර්ලොක්.කොම්පෙයාර් එක්ස්චේන්ජ් සමඟ යොමු කිරීම මාරු කරන්න (තනි ලිවීමේ නූලක් උපකල්පනය කරන්න; බහු ලිවීමේ නූල් යාවත්කාලීන කිරීම් සමමුහුර්ත කිරීම අවශ්‍ය වේ).
ට්‍රයින්කෝ

38
.නෙට් 4.0 ConcurrentDictionaryමගින් සියලුම පොදු / ආරක්‍ෂිත ක්‍රම ක්‍රියාත්මක කර ඇති අතර එය නූල් ආරක්ෂිත වේ. ඔබට පැරණි වේදිකාවලට සහය දැක්වීමට අවශ්‍ය නොවන්නේ නම්, Hashtableබහු- ත්‍රෙඩ් කළ
ඩෑන් ඊස්

ගලවා ගැනීමට නිර්නාමිකයි. සිසිල් පිළිතුර.
unkulunkulu

5
හැෂ් ටේබල් යනු පා table කයාගේ ලේඛකයාගේ නූල්-ආරක්ෂිත පමණක් බව කියවීම මට මතකයි. වෙනත් අයිතමයක් මකා දමන අතරතුර පා table කයා මේසයේ ඇති අයිතමයක් ඉල්ලා සිටී නම් සහ පා er කයා එම අයිතමය සඳහා එක් ස්ථානයකට වඩා බැලීමට කැමති නම්, පා er කයා සොයන අතරතුර ලේඛකයා අයිතමය ගෙන යා හැකිය. පරීක්ෂා කර නොමැති ස්ථානයක සිට ඇති ස්ථානයකට, එමඟින් එහි ප්‍රති item ලයක් ලෙස අයිතමය නොපවතින බවට ව්‍යාජ වාර්තාවක් ඉදිරිපත් වේ.
සුපර් කැට්

69

.NET හි, අතර ඇති වෙනස Dictionary<,>සහ HashTableමූලික වශයෙන් කලින් තිබුනේ සාමාන්‍ය වර්ගයකි, එබැවින් ස්ථිතික වර්ග පරීක්ෂා කිරීම (සහ බොක්සිං ක්‍රීඩාව අඩු කිරීම) අනුව ඔබට ජනක විද්‍යාවේ සියලු ප්‍රතිලාභ ලැබේ. නමුත් මෙය මිනිසුන් සිතන තරම් විශාල නොවේ කාර්ය සාධනයේ නියමයන් - බොක්සිං සඳහා නිශ්චිත මතක පිරිවැයක් ඇත).


35

මිනිසුන් කියන්නේ ශබ්දකෝෂයක් හැෂ් මේසයකට සමාන බවයි.

මෙය අනිවාර්යයෙන්ම සත්‍ය නොවේ. හෑෂ් වගුවක් යනු ශබ්ද කෝෂයක් ක්‍රියාත්මක කිරීමට එක් ක්‍රමයකි . එය සාමාන්‍ය එකක් වන අතර, එය .NET හි පෙරනිමිය විය හැකියDictionary පන්තියේ , නමුත් එය අර්ථ දැක්වීම අනුව එකම එකක් නොවේ.

සම්බන්ධිත ලැයිස්තුවක් හෝ සෙවුම් ගසක් භාවිතා කරමින් ඔබට ශබ්ද කෝෂයක් සමානව ක්‍රියාත්මක කළ හැකිය, එය එතරම් කාර්යක්ෂම නොවනු ඇත (සමහර කාර්යක්ෂම මෙට්‍රික් සඳහා).


4
MS docs මෙසේ කියයි: "අගයක් එහි යතුර භාවිතයෙන් ලබා ගැනීම ඉතා වේගවත්, O (1) ට ආසන්නය, මන්ද ශබ්දකෝෂය <(Of <(TKey, TValue>)>) පන්තිය හැෂ් වගුවක් ලෙස ක්‍රියාත්මක වේ." - එබැවින් ගනුදෙනු කිරීමේදී ඔබට හැෂ් ටේබල් එකක් සහතික කළ යුතුය Dictionary<K,V>. IDictionary<K,V>ඕනෑම දෙයක් විය හැකි නමුත් :)
snemarch

13
@ rix0rrr - මම හිතන්නේ ඔබට එය පසුපසට ගොස් ඇති අතර, ශබ්දකෝෂයක් භාවිතා කරන්නේ හැෂ් ටේබල් එකක් නොව හැෂ් ටේබල් ශබ්ද කෝෂයක් භාවිතා කරයි.
ජෝශප් හැමිල්ටන්

8
Ose ජොසෙෆ් හැමිල්ටන් - rix0rrr එය නිවැරදිව වටහා ගත්තේය: "හැෂ් වගුවක් යනු ශබ්ද කෝෂයක් ක්‍රියාත්මක කිරීමකි ." ඔහු අදහස් කරන්නේ "ශබ්දකෝෂය" යන සංකල්පය මිස පන්තිය නොවේ (කුඩා අවස්ථාව සටහන් කරන්න). සංකල්පමය වශයෙන්, හැෂ් වගුවක් ශබ්ද කෝෂ අතුරු මුහුණතක් ක්‍රියාත්මක කරයි. .NET හි, ශබ්දකෝෂය හැඳුනුම්පත ක්‍රියාත්මක කිරීම සඳහා හැෂ් වගුවක් භාවිතා කරයි. එය අවුල් සහගත ය;)
රොබට් හෙන්සිං

මම .NET ගැන කතා කරමින් සිටියේ, ඔහු දැක්වූ ප්‍රතිචාරයේ එයයි.
ජෝශප් හැමිල්ටන්

2
Ose ජොසෙෆ් හැමිල්ටන්: ක්‍රියාත්මක කිරීම (හෝ ක්‍රියාත්මක කිරීම ) දුරස්ථව භාවිතා කරන දේම අදහස් නොකරයි . තරමක් ප්රතිවිරුද්ධයයි. සමහර විට ඔහු එය තරමක් වෙනස් ලෙස (නමුත් එකම අර්ථයෙන්) පැවසුවා නම් එය වඩාත් පැහැදිලි වනු ඇත: "හැෂ් වගුවක් යනු ශබ්ද කෝෂයක් ක්‍රියාත්මක කිරීමට එක් ක්‍රමයකි". එනම්, ඔබට ශබ්දකෝෂයක ක්‍රියාකාරීත්වය අවශ්‍ය නම්, එය කළ හැකි එක් ක්‍රමයක් ( ශබ්ද කෝෂය ක්‍රියාත්මක කිරීම සඳහා), හැෂ් ටේබල් එකක් භාවිතා කිරීමයි.
මෙවලම් සාදන්නා ස්ටීව්

22

Collectionsසහ Genericsවස්තු සමූහය හැසිරවීමට ප්‍රයෝජනවත් වේ. .NET, සෑම එකතු වස්තූන් ලෙස එම අතුරුමුහුණත යටතේ එන IEnumerableඅනෙක් අතට ඇති, ArrayList(Index-Value))සහ HashTable(Key-Value). .NET රාමුව 2.0 පසු, ArrayListසහ HashTableඇති කරන ලදි Listසහ Dictionary. දැන්, Arraylist&HashTable වර්තමානයේ ව්‍යාපෘති වල තවදුරටත් භාවිතා නොවේ.

HashTable& Dictionary, අතර වෙනස වෙත පැමිණීම Dictionaryසාමාන්‍ය Hastableනොවන අතර සාමාන්‍ය වේ. අපට ඕනෑම වර්ගයක වස්තුවක් එක් කළ හැකිය HashTable, නමුත් ලබා ගැනීමේදී එය අවශ්‍ය වර්ගයට දැමිය යුතුය. එබැවින්, එය ආරක්ෂිත ටයිප් නොවේ. නමුත්dictionary , එය ප්‍රකාශ කරන අතරම අපට යතුර සහ අගය වර්ගය නියම කළ හැකිය, එබැවින් නැවත ලබා ගැනීමේදී වාත්තු කිරීමේ අවශ්‍යතාවයක් නොමැත.

උදාහරණයක් බලමු:

හැෂ්ටේබල්

class HashTableProgram
{
    static void Main(string[] args)
    {
        Hashtable ht = new Hashtable();
        ht.Add(1, "One");
        ht.Add(2, "Two");
        ht.Add(3, "Three");
        foreach (DictionaryEntry de in ht)
        {
            int Key = (int)de.Key; //Casting
            string value = de.Value.ToString(); //Casting
            Console.WriteLine(Key + " " + value);
        }

    }
}

ශබ්ද කෝෂය,

class DictionaryProgram
{
    static void Main(string[] args)
    {
        Dictionary<int, string> dt = new Dictionary<int, string>();
        dt.Add(1, "One");
        dt.Add(2, "Two");
        dt.Add(3, "Three");
        foreach (KeyValuePair<int, String> kv in dt)
        {
            Console.WriteLine(kv.Key + " " + kv.Value);
        }
    }
}

2
KeyValuePair සඳහා දත්ත සමුදාය පැහැදිලිව පැවරීම වෙනුවට, අපට var භාවිතා කළ හැකිය. ඉතින්, මෙය ටයිප් කිරීම අඩු කරනු ඇත - foreach (var kv in dt) ... යෝජනාවක් පමණි.
රොන්

17

ශබ්දකෝෂය:

  • අප නොපවතින යතුරක් සොයා ගැනීමට උත්සාහ කළහොත් එය ව්‍යතිරේකය ආපසු / විසි කරයි.

  • බොක්සිං සහ බොක්සිං නොමැති නිසා එය හැෂ්ටේබල් එකකට වඩා වේගවත් ය.

  • නූල් ආරක්ෂිත වන්නේ පොදු ස්ථිතික සාමාජිකයින්ට පමණි.

  • ශබ්දකෝෂය යනු සාමාන්‍ය වර්ගයකි, එයින් අදහස් කරන්නේ අපට එය ඕනෑම දත්ත වර්ගයක් සමඟ භාවිතා කළ හැකි බවයි (නිර්මාණය කිරීමේදී යතුරු සහ අගයන් දෙකම සඳහා දත්ත වර්ග නියම කළ යුතුය).

    උදාහරණයක්: Dictionary<string, string> <NameOfDictionaryVar> = new Dictionary<string, string>();

  • Dictionay Hashtable වර්ගයක්-ආරක්ෂිත ක්රියාත්මක වන අතර, Keysසහ Valuesමුලදීම ඇත.

කඩිනම්:

  • අපි නොපවතින යතුරක් සොයා ගැනීමට උත්සාහ කළහොත් එය අහෝසි වේ.

  • එය ශබ්ද කෝෂයට වඩා මන්දගාමී වන්නේ එයට බොක්සිං සහ බොක්සිං අවශ්‍ය වන බැවිනි.

  • හැෂ් ටේබල් එකක සිටින සියලුම සාමාජිකයන් නූල් ආරක්ෂිතයි,

  • හැෂ්ටබල් යනු සාමාන්‍ය වර්ගයක් නොවේ,

  • හැෂ්ටබල් යනු ලිහිල් ලෙස ටයිප් කළ දත්ත ව්‍යුහයකි, අපට ඕනෑම වර්ගයක යතුරු සහ අගයන් එකතු කළ හැකිය.


"අපි නොපවතින යතුරක් සොයා ගැනීමට උත්සාහ කළහොත් එය ව්‍යතිරේකය ආපසු / විසි කරයි." ඔබ භාවිතා කරන්නේ නම් නොවේDictionary.TryGetValue
ජිම් බෝල්ටර්

17

එම්එස්ඩීඑන් හි සී # ලිපිය භාවිතා කරමින් දත්ත ව්‍යුහයන් පිළිබඳ පුළුල් පරීක්ෂණයෙන් කියැවෙන්නේ ision ට්ටන නිරාකරණ උපාය මාර්ගයේ ද වෙනසක් ඇති බවයි :

හැෂ්ටේබල් පංතිය නැවත සකස් කිරීම ලෙස හඳුන්වන තාක්ෂණයක් භාවිතා කරයි .

නැවත සකස් කිරීම පහත පරිදි ක්‍රියා කරයි: H 1 ... H n හි විවිධ කාර්යයන් සමූහයක් ඇති අතර, හැෂ් වගුවෙන් අයිතමයක් ඇතුළු කිරීමේදී හෝ ලබා ගැනීමේදී, මුලින් H 1 හැෂ් ශ්‍රිතය භාවිතා වේ. මෙය ision ට්ටනයකට තුඩු දෙන්නේ නම් , ඒ වෙනුවට H 2 උත්සාහ කරනු ලැබේ, අවශ්‍ය නම් H n දක්වා .

ශබ්ද කෝෂය දම්වැල ලෙස හඳුන්වන තාක්ෂණයක් භාවිතා කරයි .

නැවත සකස් කිරීම සමඟ, ision ට්ටනයකදී හැෂ් නැවත ගණනය කරනු ලබන අතර, හැෂ් එකකට අනුරූප නව තව් උත්සාහ කරනු ලැබේ. කෙසේ වෙතත්, දම්වැල සමඟ ද්විතියික දත්ත ව්‍යුහයක් ඕනෑම .ට්ටනයක් සිදු කිරීමට යොදා ගනී . නිශ්චිතවම, ශබ්ද කෝෂයේ සෑම තව්වකටම එම බාල්දියට සිතියම් ගත කරන මූලද්‍රව්‍ය සමූහයක් ඇත. Ision ට්ටනයක් සිදු වූ විට, ision ට්ටන මූලද්‍රව්‍යය බාල්දියේ ලැයිස්තුවට සූදානම් වේ.


17

.NET Framework 3.5 සිට, එහි HashSet<T>සියලු වාසි ලබා දෙන a ද ඇතDictionary<TKey, TValue> ඔබට යතුරු පමණක් අවශ්‍ය නම් සහ අගයන් නොමැති නම් .

එබැවින් ඔබ ආරක්ෂිත හැෂ් වගුව අනුකරණය කිරීමට a භාවිතා කර Dictionary<MyType, object>සෑම විටම අගය nullසකසන්නේ නම්, ඔබ වෙත මාරුවීම සලකා බැලිය යුතුය HashSet<T>.


15

මෙම Hashtableඉතා ලිහිල්ව-ටයිප් කළ දත්ත ව්යූහයක්, එසේ ඔබ වෙත කිසිදු ආකාරයේ යතුරු හා අගයන් එකතු කල හැක Hashtable. මෙම Dictionaryපන්තිය වර්ගය-ආරක්ෂිත Hashtableක්රියාත්මක කිරීම, සහ යතුරු හා අගයන් මුලදීම ඇත. Dictionaryනිදසුනක් නිර්මාණය කිරීමේදී , යතුර සහ වටිනාකම යන දෙකම සඳහා දත්ත වර්ග නියම කළ යුතුය.


11

MSDN පවසන බව සැලකිල්ලට ගන්න: "ශබ්ද කෝෂය <(Of <(TKey, TValue>)> පන්තිය ක්‍රියාත්මක වන්නේ හැෂ් වගුවක් ලෙස මිස" ශබ්දකෝෂය <(Of <(TKey, TValue>)>) පන්තිය හැෂ් ටේබල් ලෙස ක්‍රියාත්මක නොවේ. "

ශබ්ද කෝෂය හැෂ් ටේබල් ලෙස ක්‍රියාත්මක නොවේ, නමුත් එය ක්‍රියාත්මක වන්නේ හැෂ් වගුවක සංකල්පයට අනුව ය. අභ්‍යන්තරව මයික්‍රොසොෆ්ට් ආයතනයට එකම කේතය භාවිතා කර TKey සහ TValue සමඟ වස්තු වර්ගයේ සංකේත ආදේශ කළ හැකි වුවද, ජෙනරික්ස් භාවිතය නිසා ක්‍රියාත්මක කිරීම හැෂ් ටේබල් පන්තියට සම්බන්ධ නොවේ.

.NET 1.0 හි ජනකතා නොපවතී; HashTable සහ ArrayList මුලින් ආරම්භ වූයේ මෙහිදීය.


ඔබට එම MSDN උපුටා දැක්වීම නිවැරදි කළ හැකිද? යමක් අතුරුදහන් හෝ වැරදි ය; එය ව්‍යාකරණ හා තරමක් තේරුම්ගත නොහැකි ය.
පීටර් මෝර්ටෙන්සන්

10

හැෂ්ටේබල්:

යතුර / අගය ගොඩවල් තුළට ගබඩා කරන අතරතුර වස්තු (බොක්සිං) වර්ගයක් බවට පරිවර්තනය වේ.

ගොඩේ සිට කියවන අතරතුර යතුර / අගය අපේක්ෂිත වර්ගයට පරිවර්තනය කළ යුතුය.

මෙම මෙහෙයුම් ඉතා මිල අධිකය. අපි හැකි තරම් බොක්සිං / බොක්සිං ක්‍රීඩාවෙන් වැළකී සිටිය යුතුයි.

ශබ්දකෝෂය: හැෂ් ටේබල් හි සාමාන්‍ය ප්‍රභේදය.

බොක්සිං / බොක්සිං නැත. පරිවර්තන අවශ්‍ය නොවේ.


8

හැෂ්ටබල් වස්තුවක් එකතුවෙහි මූලද්‍රව්‍ය අඩංගු බාල්දි වලින් සමන්විත වේ. බාල්දියක් යනු හැෂ්ටබල් තුළ ඇති අථත්‍ය උප සමූහයකි, එමඟින් බොහෝ එකතු කිරීම් වලට වඩා සෙවීම සහ ලබා ගැනීම පහසු සහ වේගවත් කරයි.

ශබ්දකෝෂ පන්තියට හැෂ්ටබල් පන්තියට සමාන ක්‍රියාකාරිත්වයක් ඇත. නිශ්චිත වර්ගයක ශබ්ද කෝෂයකට (වස්තුව හැර) හැෂ් ටේබල් වලට වඩා හොඳ කාර්ය සාධනයක් ඇත.

වැඩිදුර කියවීම සඳහා: හැෂ්ටබල් සහ ශබ්ද කෝෂ එකතු කිරීමේ වර්ග


7

තවත් වැදගත් වෙනසක් වන්නේ හැෂ්ටබල් යනු නූල් ආරක්ෂිත වීමයි. හැෂ්ටේබල් තුළ බහු පා er ක / තනි ලේඛක (එම්ආර් / එස්ඩබ්ලිව්) නූල් සුරක්‍ෂිතතාවයක් ඇති අතර එයින් අදහස් කරන්නේ හැෂ්ටේබල් එක් ලේඛකයෙකුට බහු පා readers කයන් සමඟ අගුලු දැමීමකින් තොරව ඉඩ දෙන බවයි.

ශබ්ද කෝෂයේ නූල් ආරක්ෂාවක් නොමැත; ඔබට නූල් ආරක්ෂාව අවශ්‍ය නම් ඔබ ඔබේම සමමුහුර්තකරණය ක්‍රියාත්මක කළ යුතුය.

තවදුරටත් විස්තර කිරීම සඳහා:

හැෂ්ටේබල් මඟින් නූල්-ආරක්ෂාව සපයයි Synchronized දේපල අතර එමඟින් එකතුව වටා නූල්-ආරක්ෂිත එතුමක් ලබා දේ. සෑම එකතු කිරීමක් හෝ ඉවත් කිරීමක් සඳහාම මුළු එකතුවම අගුළු දැමීමෙන් එතීම ක්‍රියා කරයි. එමනිසා, එකතුවට ප්‍රවේශ වීමට උත්සාහ කරන සෑම නූල් එකක්ම එක අගුලක් ගන්නා තෙක් එහි වාරය එනතෙක් බලා සිටිය යුතුය. මෙය පරිමාණය කළ නොහැකි අතර විශාල එකතු කිරීම් සඳහා සැලකිය යුතු කාර්ය සාධනය පිරිහීමට හේතු විය හැක. එසේම, සැලසුම ජාතියේ තත්වයන්ගෙන් සම්පූර්ණයෙන්ම ආරක්ෂා නොවේ.

.NET Framework 2.0 එකතු කිරීමේ පන්ති List<T>, Dictionary<TKey, TValue>ආදිය කිසිදු නූල් සමමුහුර්තතාවයක් සපයන්නේ නැත; සමගාමීව බහුවිධ නූල් මත අයිතම එකතු කරන විට හෝ ඉවත් කරන විට පරිශීලක කේතය සියලු සමමුහුර්තකරණය ලබා දිය යුතුය

ඔබට ටයිප් ආරක්ෂාව සහ නූල් ආරක්ෂාව අවශ්‍ය නම්, .NET රාමුවේ සමගාමී එකතු කිරීමේ පන්ති භාවිතා කරන්න. වැඩිදුර කියවීම මෙතැනින් .

අතිරේක වෙනසක් නම්, අපි ශබ්ද කෝෂයේ බහු ඇතුළත් කිරීම් එකතු කරන විට, ඇතුළත් කිරීම් අනුපිළිවෙල පවත්වා ගෙන යාමයි. අපි ශබ්දකෝෂයෙන් අයිතම ලබා ගත් විට, අප ඒවා ඇතුළත් කළ අනුපිළිවෙලින්ම වාර්තා ලැබෙනු ඇත. Hashtable ඇතුළු කිරීමේ අනුපිළිවෙල ආරක්ෂා නොකරන අතර.


මා තේරුම් ගත් දෙයින්, මකාදැමීම් සම්බන්ධ නොවනHashset භාවිත අවස්ථා වලදී MR / SW නූල් ආරක්ෂාව සහතික කරයි. මම හිතන්නේ එය සම්පුර්ණයෙන්ම MR / SW ආරක්ෂිත වීමට අදහස් කර ඇති නමුත් මකාදැමීම් ආරක්ෂිතව හැසිරවීම MR / SW ආරක්ෂාව සඳහා වන වියදම බෙහෙවින් වැඩි කරයි. මකාදැමීමේ අවස්ථා වලදී අවම පිරිවැයකින් MR / SW ආරක්ෂාව ලබා දිය හැකි වුවද, මකාදැමීමේ අවස්ථා “විශේෂ” ලෙස සැලකීමෙන් වැළකී සිටීමට MS ට අවශ්‍ය වූ බව මම සිතමි. Dictionary
සුපර්කැට්

5

මට හඳුනාගත හැකි තවත් එක් වෙනසක් නම්:

වෙබ් සේවා සමඟ අපට ශබ්ද කෝෂය <KT, VT> (ජනක විද්‍යාව) භාවිතා කළ නොහැක. හේතුව වෙබ් සේවා ප්‍රමිතියක් ජනක ප්‍රමිතියට සහාය නොදක්වයි.


සබන් මත පදනම් වූ වෙබ් සේවාවේ අපට සාමාන්‍ය ලැයිස්තු (ලැයිස්තුව <string>) භාවිතා කළ හැකිය. නමුත්, අපට වෙබ් සේවාවක ශබ්ද කෝෂය (හෝ හැෂ් ටේබල්) භාවිතා කළ නොහැක. මම හිතන්නේ .net xmlserializer හට ශබ්ද කෝෂ වස්තුව හැසිරවිය නොහැකි වීමයි.
සිද්ධාර්ත්

5

Dictionary<> සාමාන්‍ය වර්ගයක් වන අතර එම නිසා එය ආරක්ෂිත වේ.

ඔබට ඕනෑම වටිනාකමක් හැෂ් ටේබල් තුළට ඇතුළු කළ හැකි අතර මෙය සමහර විට ව්‍යතිරේකයක් විය හැකිය. නමුත් Dictionary<int>පූර්ණ සංඛ්‍යා අගයන් පමණක් පිළිගනු ඇති අතර ඒ හා සමානව Dictionary<string>නූල් පමණක් පිළිගනු ඇත.

එබැවින්, ඒ Dictionary<>වෙනුවට භාවිතා කිරීම වඩා හොඳය HashTable.


0

බොහෝ ක්‍රමලේඛන භාෂාවල, හැෂ් ටේබල් වලට වඩා ශබ්ද කෝෂ වඩාත් කැමති වේ

මෙය අත්‍යවශ්‍යයෙන්ම සත්‍ය යැයි මම නොසිතමි, බොහෝ භාෂාවන්ට ඔවුන් කැමති පාරිභාෂිතය අනුව එකක් හෝ වෙනත් එකක් තිබේ .

කෙසේ වෙතත්, C # හි පැහැදිලි හේතුව (මට) C # HashTables සහ පද්ධතියේ අනෙකුත් සාමාජිකයන්ය. එකතු කිරීමේ නාම අවකාශය බොහෝ දුරට යල්පැන ඇති ඒවාය. ඔවුන් c # V1.1 හි සිටියහ. ඒවා C # 2.0 වෙතින් System.Collections.Generic නාම අවකාශයේ සාමාන්‍ය පන්ති මගින් ප්‍රතිස්ථාපනය කර ඇත.


ශබ්දකෝෂයකට වඩා හැෂ් ටේබල් එකක ඇති වාසියක් නම්, ශබ්දකෝෂයක යතුරක් නොමැති නම්, එය දෝෂයක් ඇති කරයි. හැෂ් ටේබල් එකක යතුරක් නොමැති නම්, එය අහෝසි වේ.
බිල් නෝමන්

C # හි මම තවමත් System.Collections.Hashtable භාවිතා කිරීමෙන් වැළකී සිටිමි. යතුර පවතින්නේ දැයි ඔබ නොදන්නේ නම් ඔබට ශබ්ද කෝෂයේ ට්‍රයිගෙට් අගය හෝ හස්කේ භාවිතා කළ හැකිය.
kristianp

අපොයි, හස්කේ නොව, එය අඩංගු විය යුතුය.
kristianp

-3

.NET Reflector භාවිතා කිරීමෙන් මා දකින දේ අනුව :

[Serializable, ComVisible(true)]
public abstract class DictionaryBase : IDictionary, ICollection, IEnumerable
{
    // Fields
    private Hashtable hashtable;

    // Methods
    protected DictionaryBase();
    public void Clear();
.
.
.
}
Take note of these lines
// Fields
private Hashtable hashtable;

එබැවින් ශබ්ද කෝෂය අභ්‍යන්තරව හැෂ් ටේබල් එකක් භාවිතා කරන බවට අපට සහතික විය හැකිය.


16
System.Collections.Generic.Dictionary <TKey, TValue> ශබ්ද කෝෂයේ සිට ව්‍යුත්පන්න නොවේ.
snemarch

"එබැවින් ශබ්ද කෝෂය අභ්‍යන්තරව හැෂ් ටේබල් එකක් භාවිතා කරන බවට අපට සහතික විය හැකිය." - ඒක හොඳයි, නමුත් එයට ප්‍රශ්නයට කිසිම සම්බන්ධයක් නැහැ.
ජිම් බෝල්ටර්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.