ශබ්ද කෝෂයක් හරහා නැවත යෙදීමට හොඳම ක්‍රමය කුමක්ද?


2641

C # හි ශබ්දකෝෂයක් හරහා නැවත යෙදීමට විවිධ ක්‍රම කිහිපයක් මම දැක ඇත්තෙමි. සම්මත ක්‍රමයක් තිබේද?


109
923 වතාවක් ඉහළට ඔසවා ඇති මෙම ප්‍රශ්නයට පිළිතුරු බොහෝමයක් තිබීම ගැන මම පුදුම වෙමි .. (foreach ofcourse භාවිතා කරයි) .. මම තර්ක කරමි, නැතහොත් අවම වශයෙන් ඔබට ශබ්ද කෝෂයක් හරහා නැවත කියවීමට සිදුවුවහොත්, ඔබ එසේ විය හැකි බව එය වැරදි ලෙස / නුසුදුසු ලෙස භාවිතා කිරීම .. මට මෙම ප්‍රකාශය කිරීමට සිදු වූයේ, IMHO නුසුදුසු ආකාරවලින් ශබ්දකෝෂ අනිසි ලෙස භාවිතා කිරීම මා දැක ඇති හෙයිනි ... ඔව්, ඔබ ශබ්ද කෝෂය නැවත කියවනවාට වඩා දුර්ලභ අවස්ථාවන් තිබිය හැකිය. එය නිර්මාණය කර ඇත්තේ .. ශබ්ද කෝෂයක් හරහා නැවත ක්‍රියා කරන්නේ කෙසේදැයි කල්පනා කිරීමට පෙර කරුණාකර එය මතකයේ තබා ගන්න.
විකාස් ගුප්තා

74
IkaVikasGupta යතුරු යනු කුමක්දැයි ඔබ නොදන්නා විට යතුරු-වටිනාකම් යුගල එකතුවක් සමඟ යමක් කිරීමට ඔබ යෝජනා කරන්නේ කුමක්ද?
nasch

26
isdisplayName ඔබට එක් එක් යතුරු-වටිනාකම් යුගල සමඟ යමක් කිරීමට අවශ්‍ය නමුත් අගයන් බැලීමට භාවිතා කළ යුතු යතුරු ගැන සඳහනක් නොමැති නම්, ඔබ ශබ්ද කෝෂය හරහා නැවත කියනු ඇත, නේද? මම පෙන්වා දුන්නේ මෙය සාමාන්‍යයෙන් වැරදි භාවිතයක් යැයි විකාස්ගේ ප්‍රකාශය නොතකා ඔබට එය කිරීමට අවශ්‍ය අවස්ථා තිබිය හැකි බවයි.
nasch

35
එය වැරදි භාවිතය යැයි කීමෙන් ගම්‍ය වන්නේ වඩා හොඳ විකල්පයක් ඇති බවයි. එම විකල්පය කුමක්ද?
කයිල් ඩෙලනි

42
විකාස්ගුප්තා වැරදියි, න්‍යායාත්මක නොවන අවස්ථාවන්හි ඉහළ කාර්යසාධනයක් සහිත සී # සහ සී ++ වැඩසටහන් වලින් වසර ගණනාවකට පසු මට සහතික කළ හැකිය. යමෙකු ශබ්දකෝෂයක් නිර්මාණය කිරීම, අද්විතීය යතුරු-වටිනාකම් යුගල ගබඩා කිරීම සහ එකතු කිරීම තුළ අද්විතීය යතුරු ඇති බව සනාථ කෙරෙන මෙම අගයන් නැවත නැවත කියවීම වැනි අවස්ථා තිබේ. තවත් එකතු කිරීම් නිර්මාණය කිරීම ශබ්ද කෝෂ නැවතීම වළක්වා ගැනීමේ සැබවින්ම අකාර්යක්ෂම හා මිල අධික ක්‍රමයකි. කරුණාකර ඔබේ දෘෂ්ටිකෝණය පැහැදිලි කරන ප්‍රශ්නයට පිළිතුරක් ලෙස හොඳ විකල්පයක් සපයන්න, එසේ නොමැතිනම් ඔබේ අදහස විකාරයකි.
sɐunıɔ ןɐ qɐp

Answers:


3737
foreach(KeyValuePair<string, string> entry in myDictionary)
{
    // do something with entry.Value or entry.Key
}

29
ශබ්ද කෝෂයේ යතුරු / අගය වර්ගය මා හරියටම නොදන්නේ නම් කුමක් කළ යුතුද? var entryඑම අවස්ථාවේ දී භාවිතා කිරීම වඩා හොඳය, එබැවින් මම ඉහත පිළිතුර වෙනුවට දෙවන පෙනුමෙන් මෙම පිළිතුර ඡන්දය ප්‍රකාශ කළෙමි .
ඔසෙයාර් කෆ්රේ

96
varවර්ගය සාමාන්‍යයෙන් නරක පුරුද්දක් බව ඔබ නොදන්නා විට භාවිතා කිරීම.
Nate

53
මෙම පිළිතුර වඩා උසස් වන්නේ පැබ්ලෝ ආපසු එන වර්ගය අපැහැදිලි කරන කම්මැලි කෝඩර් "var" භාවිතයට පෙරනිමියෙන් නොසිටි බැවිනි.
MonkeyWrench

120
OnMonkeyWrench: මෙහ්. දෘශ්‍ය ස්ටුඩියෝ වර්ගය කුමක්දැයි දනී; ඔබ කළ යුතුව ඇත්තේ සොයා ගැනීමට විචල්‍යය මත සැරිසැරීම පමණි.
රොබට් හාවි

31
මා තේරුම් ගත් පරිදි, varක්‍රියා කරන්නේ වර්ගය සම්පාදනය කරන වේලාවේදී නම් පමණි. විෂුවල් ස්ටුඩියෝ වර්ගය දන්නේ නම් එය ඔබට ද සොයා ගත හැකිය.
කයිල් ඩෙලනි

870

ඔබ C # හි සාමාන්‍ය ශබ්දකෝෂයක් භාවිතා කිරීමට උත්සාහ කරන්නේ නම්, ඔබ වෙනත් භාෂාවක සහායක අරාවක් භාවිතා කරයි:

foreach(var item in myDictionary)
{
  foo(item.Key);
  bar(item.Value);
}

නැතහොත්, ඔබට අවශ්‍ය වන්නේ යතුරු එකතු කිරීම පමණක් නැවත භාවිතා කිරීමට නම්, භාවිතා කරන්න

foreach(var item in myDictionary.Keys)
{
  foo(item);
}

අවසාන වශයෙන්, ඔබ සාරධර්ම ගැන පමණක් උනන්දු වන්නේ නම්:

foreach(var item in myDictionary.Values)
{
  foo(item);
}

(යතුරුපදය varවිකල්ප C # 3.0 සහ ඊට ඉහළින් ඇති අංගයක් බව සලකන්න , ඔබට ඔබේ යතුරු / අගයන් හරියටම භාවිතා කළ හැකිය)


11
ඔබේ පළමු කේත වාරණය සඳහා var විශේෂාංගය වඩාත් අවශ්‍ය වේ :)
nawfal

27
මෙම පිළිතුර මඟින් ඔබට යතුරු හෝ අගයන් පැහැදිලිව ප්‍රකාශ කළ හැකි බව මම අගය කරමි.
රොට්සයිසර් මහෝ

11
මම මෙහි var භාවිතා කිරීමට කැමති නැත. එය සින්ටැක්ටික් සීනි පමණක් බැවින් එය මෙහි භාවිතා කරන්නේ ඇයි? යමෙකු කේතය කියවීමට උත්සාහ කරන විට, වර්ගය තීරණය කිරීම සඳහා ඔවුන්ට කේතය වටා පනින්නට සිදුවේ myDictionary(එය ඇත්ත වශයෙන්ම පා name මාලාවේ නම නොවේ නම්). වර්ගය පැහැදිලිව පෙනෙන විට var භාවිතා කිරීම හොඳ යැයි මම සිතමි. var x = "some string"නමුත් එය ක්ෂණිකව නොපෙනෙන විට එය කේත කියවන්නාට / විචාරකයාට රිදවන කම්මැලි කේතීකරණයක් යැයි මම සිතමි
ජේම්ස් විර්ස්බා

8
varමගේ මතය අනුව අරපිරිමැස්මෙන් භාවිතා කළ යුතුය. විශේෂයෙන් මෙහි, එය ruc ලදායී නොවේ: වර්ගය KeyValuePairප්‍රශ්නයට අදාළ වේ.
සින්ජයි

3
varඅද්විතීය අරමුණක් ඇති අතර එය 'සින්ටැක්ටික්' සීනි යැයි මම විශ්වාස නොකරමි. එය හිතාමතාම භාවිතා කිරීම සුදුසු ප්‍රවේශයකි.
යෝෂුවා කේ

159

සමහර අවස්ථා වලදී ඔබට ලූප ක්‍රියාත්මක කිරීම සඳහා සැපයිය හැකි කවුන්ටරයක් ​​අවශ්‍ය විය හැකිය. ඒ සඳහා, LINQ මඟින් ElementAtපහත සඳහන් දෑ සක්‍රීය කරයි:

for (int index = 0; index < dictionary.Count; index++) {
  var item = dictionary.ElementAt(index);
  var itemKey = item.Key;
  var itemValue = item.Value;
}

21
'.ElementAt' ක්‍රමය භාවිතා කිරීමට, මතක තබා ගන්න: System.Linq භාවිතා කිරීම; මෙය fx හි ඇතුළත් නොවේ. ස්වයංක්‍රීයව ජනනය කරන ලද පරීක්ෂණ පන්ති.
ටීනියා

14
ඔබ යතුරු හා සම්බන්ධ අගයන් වෙනස් කරන්නේ නම් මෙය යා යුතු මාර්ගයයි. වෙනත් ආකාරයකින් foreach () වෙනස් කිරීමේදී සහ භාවිතා කිරීමේදී ව්‍යතිරේකයක් විසි කරනු ලැබේ.
මයික් ඩි ක්ලර්ක්

27
නැත ElementAtඑය සාමාන්ය (n) මෙහෙයුම?
ආටුරෝ ටොරස් සාන්චෙස්

163
මෙම පිළිතුර බොහෝ ඉහළ නැංවීම් වලට නුසුදුසු ය. ශබ්දකෝෂයකට ව්‍යංග අනුපිළිවෙලක් නොමැත, එබැවින් .ElementAtමෙම සන්දර්භය තුළ භාවිතා කිරීම සියුම් දෝෂ වලට තුඩු දිය හැකිය. ආටුරෝගේ කාරණය ඊටත් වඩා බරපතල ය. dictionary.Count + 1O (n) පමණක් විය යුතු මෙහෙයුමක් සඳහා O (n ^ 2) සංකීර්ණතාවයට තුඩු දෙන ශබ්ද කෝෂ වේලාවන් ඔබ නැවත කියනු ඇත . ඔබට සැබවින්ම දර්ශකයක් අවශ්‍ය නම් (ඔබ එසේ කරන්නේ නම්, ඔබ බොහෝ විට වැරදි එකතු කිරීමේ වර්ගය මුලින් භාවිතා කරයි), ඔබ dictionary.Select( (kvp, idx) => new {Index = idx, kvp.Key, kvp.Value})ඒ වෙනුවට නැවත යෙදිය යුතු .ElementAtඅතර ලූපය තුළ භාවිතා නොකළ යුතුය .
වියදම් කරන්න

5
ElementAt - o (n) මෙහෙයුම! ඇත්තටම? ඔබ එය නොකළ යුතු ආකාරය පිළිබඳ උදාහරණය මෙයයි. මේ බොහෝ උඩු යටිකුරු කිරීම්?
මුකේෂ් අද්වරියූ

96

ඔබ යතුරු හෝ අගයන් පසුපස සිටිනවාද යන්න මත රඳා පවතී ...

MSDN Dictionary(TKey, TValue)පන්තියේ විස්තරයෙන්:

// When you use foreach to enumerate dictionary elements,
// the elements are retrieved as KeyValuePair objects.
Console.WriteLine();
foreach( KeyValuePair<string, string> kvp in openWith )
{
    Console.WriteLine("Key = {0}, Value = {1}", 
        kvp.Key, kvp.Value);
}

// To get the values alone, use the Values property.
Dictionary<string, string>.ValueCollection valueColl =
    openWith.Values;

// The elements of the ValueCollection are strongly typed
// with the type that was specified for dictionary values.
Console.WriteLine();
foreach( string s in valueColl )
{
    Console.WriteLine("Value = {0}", s);
}

// To get the keys alone, use the Keys property.
Dictionary<string, string>.KeyCollection keyColl =
    openWith.Keys;

// The elements of the KeyCollection are strongly typed
// with the type that was specified for dictionary keys.
Console.WriteLine();
foreach( string s in keyColl )
{
    Console.WriteLine("Key = {0}", s);
}

82

සාමාන්‍යයෙන්, නිශ්චිත සන්දර්භයක් නොමැතිව “හොඳම ක්‍රමය” ඉල්ලීම හරියට හොඳම වර්ණය කුමක්දැයි විමසීමට සමානද ?

එක් අතකින්, බොහෝ වර්ණ ඇති අතර හොඳම වර්ණයක් නොමැත. එය අවශ්‍යතාවය මත සහ බොහෝ විට රසය මත ද රඳා පවතී.

අනෙක් අතට, C # හි ශබ්දකෝෂයක් හරහා නැවත කියවීමට බොහෝ ක්‍රම ඇති අතර හොඳම ක්‍රමයක් නොමැත. එය අවශ්‍යතාවය මත සහ බොහෝ විට රසය මත ද රඳා පවතී.

වඩාත් සරල මාර්ගය

foreach (var kvp in items)
{
    // key is kvp.Key
    doStuff(kvp.Value)
}

ඔබට අවශ්‍ය වන්නේ වටිනාකම පමණි (එය ඇමතීමට ඉඩ දෙයි item, වඩා කියවිය හැකි kvp.Value).

foreach (var item in items.Values)
{
    doStuff(item)
}

ඔබට නිශ්චිත වර්ග කිරීමේ අනුපිළිවෙලක් අවශ්‍ය නම්

සාමාන්‍යයෙන්, ශබ්ද කෝෂයක් ගණනය කිරීමේ අනුපිළිවෙල ගැන ආරම්භකයින් පුදුම වේ.

ඇණවුම (සහ තවත් බොහෝ දේ) නියම කිරීමට ඉඩ දෙන සංක්ෂිප්ත වාක්‍ය ඛණ්ඩයක් ලින්ක් සපයයි, උදා:

foreach (var kvp in items.OrderBy(kvp => kvp.Key))
{
    // key is kvp.Key
    doStuff(kvp.Value)
}

නැවතත් ඔබට අවශ්‍ය වන්නේ වටිනාකම පමණි. ලින්ක් ද මේ සඳහා සංක්ෂිප්ත විසඳුමක් සපයයි:

  • අගය මත කෙලින්ම නැවත කියන්න (එය ඇමතීමට ඉඩ දෙයි item, වඩා කියවිය හැකි යkvp.Value )
  • නමුත් යතුරු අනුව වර්ග කර ඇත

මේ තියෙන්නේ:

foreach (var item in items.OrderBy(kvp => kvp.Key).Select(kvp => kvp.Value))
{
    doStuff(item)
}

මෙම උදාහරණ වලින් ඔබට කළ හැකි තවත් බොහෝ තාත්වික භාවිත අවස්ථා තිබේ. ඔබට නිශ්චිත ඇණවුමක් අවශ්‍ය නොවන්නේ නම්, “වඩාත්ම සරල ක්‍රමයට” ඇලී සිටින්න (ඉහත බලන්න)!


අන්තිම එක විය යුත්තේ .Valuesතෝරාගත් වගන්තියක් නොවේ.
මාෆි

Af මාෆි ඔබට විශ්වාසද? OrderBy විසින් ආපසු ලබා දුන් අගයන් KeyValuePair වර්ගයට අයත් නොවේ, ඔවුන්ට Valueක්ෂේත්‍රයක් නොමැත . මම මෙහි දකින නිවැරදි වර්ගය IOrderedEnumerable<KeyValuePair<TKey, TValue>>. සමහර විට ඔබ වෙනත් දෙයක් අදහස් කළාද? ඔබ අදහස් කරන දේ පෙන්වන සම්පූර්ණ පේළියක් ලිවිය හැකිද (එය පරීක්ෂා කරන්න)?
ස්ටෙෆාන් ගුරිචොන්

මෙම පිළිතුරෙහි මා අදහස් කළ දේ අඩංගු යැයි මම සිතමි: stackoverflow.com/a/141105/5962841 නමුත් මා යම් දෙයක් ව්‍යාකූල කර ඇත්නම් මාව නිවැරදි කරන්න
මාෆි

1
Af මාෆි මගේ සම්පූර්ණ පිළිතුර නැවත කියවන්න, කේත කොටස් අතර පැහැදිලි කිරීම් සන්දර්භය කියයි. ඔබ සඳහන් කළ පිළිතුර මගේ පිළිතුරේ දෙවන කේත කොටස වැනි ය (ඇණවුමක් අවශ්‍ය නොවේ). ඔන්න මම items.Valueයෝජනා කළා වගේ ඔයා ලිව්වා . ඔබ අදහස් දැක්වූ සිව්වන කොටසේදී, යතුරු අගයන් වෙනුවට ශබ්ද කෝෂයේ ඇති අගයන් කෙලින්ම ගණනය Select()කිරීමට මෙය හේතු foreachවේ. කෙසේ හෝ ඔබ Select()මෙම නඩුවේ අකමැති නම්, ඔබට තෙවන කේත අංශයට වැඩි කැමැත්තක් දැක්විය හැකිය. සිව්වන කොටසේ කාරණය වන්නේ කෙනෙකුට LINQ සමඟ එකතු කිරීම පෙර සැකසීමට හැකි බව පෙන්වීමයි.
ස්ටෙෆාන් ගුරිචොන්

1
ඔබ එසේ කළහොත් ඔබ .Keys.Orderby()යතුරු ලැයිස්තුවක් මත නැවත කියනු ඇත. ඔබට අවශ්‍ය වන්නේ එපමණක් නම් හොඳයි. ඔබට අගයන් අවශ්‍ය නම්, ලූපය තුළ අගය ලබා ගැනීම සඳහා එක් එක් යතුරේ ශබ්ද කෝෂය විමසීමට සිදුවේ. බොහෝ අවස්ථාවන්හි එය ප්‍රායෝගික වෙනසක් නොකරනු ඇත. ඉහළ කාර්යසාධනයක් සහිත අවස්ථාවක, එය එසේ වනු ඇත. පිළිතුර ආරම්භයේ මා ලියා ඇති පරිදි: "බොහෝ ක්‍රම තිබේ (...) සහ හොඳම ක්‍රමයක් නොමැත. එය අවශ්‍යතාවය මත රඳා පවතින අතර බොහෝ විට රසය මත ද වේ."
ස්ටෙෆාන් ගුරිචොන්

53

මම කියන්නේ foreach යනු සම්මත ක්‍රමය බවයි, නමුත් එය පැහැදිලිවම ඔබ සොයන දේ මත රඳා පවතී

foreach(var kvp in my_dictionary) {
  ...
}

ඔබ සොයන්නේ එයද?


42
ම්, අයිතමය "වටිනාකම" ලෙස නම් කිරීම අවුල් සහගත නොවේද? ඔබ සාමාන්‍යයෙන් "value.Key" සහ "value.Value" වැනි සින්ටැක්ස් භාවිතා කරනු ඇත, එය කේතය කියවන වෙනත් කිසිවෙකුට එතරම් අවබෝධයක් නොදක්වයි, විශේෂයෙන් .Net ශබ්දකෝෂය ක්‍රියාත්මක වන ආකාරය ගැන ඔවුන් නොදන්නේ නම් .
රෙනීපෙට්

3
EnnRenniePet kvpබහුලව භාවිතා වන්නේ ශබ්ද කෝෂ සහ අදාළ දත්ත ව්‍යුහයන් හරහා යතුරු ලියනය කිරීමේදී KeyValuePair අවස්ථා නම් කිරීමට ය : foreach(var kvp in myDictionary){....
mbx

39

C # 7.0 විසින් Deconstructors හඳුන්වා දී ඇති අතර ඔබ .NET Core 2.0+ යෙදුමභාවිතා කරන්නේ නම්, ව්‍යුහයKeyValuePair<>දැනටමත්Deconstruct()ඔබ වෙනුවෙන්ඇතුළත් කරඇත. එබැවින් ඔබට කළ හැකිය:

var dic = new Dictionary<int, string>() { { 1, "One" }, { 2, "Two" }, { 3, "Three" } };
foreach (var (key, value) in dic) {
    Console.WriteLine($"Item [{key}] = {value}");
}
//Or
foreach (var (_, value) in dic) {
    Console.WriteLine($"Item [NO_ID] = {value}");
}
//Or
foreach ((int key, string value) in dic) {
    Console.WriteLine($"Item [{key}] = {value}");
}

රූප විස්තරය මෙහි ඇතුළත් කරන්න


5
KeyValuePair හි අවම වශයෙන් 4.7.2 දක්වා වූ .NET Framework භාවිතා කරන්නේ නම්, මෙය උත්සාහ කරන්න:foreach (var (key, value) in dic.Select(x => (x.Key, x.Value)))
nwsmith

38

බහු තෙරපුම් සැකසුම් සඳහා ඔබට විශාල ශබ්ද කෝෂවල මෙය උත්සාහ කළ හැකිය.

dictionary
.AsParallel()
.ForAll(pair => 
{ 
    // Process pair.Key and pair.Value here
});

8
IWiiMaxx සහ වඩා වැදගත් වන්නේ මෙම අයිතම එකිනෙක මත රඳා
නොපවතින්නේ නම්

28

මෙම ප්‍රශ්නයට දැනටමත් විශාල ප්‍රතිචාර ප්‍රමාණයක් ලැබී ඇති බව මම අගය කරමි, නමුත් මට කුඩා පර්යේෂණයක් කිරීමට අවශ්‍ය විය.

අරාව වැනි දෙයක් හරහා නැවත යෙදීම සමඟ සසඳන විට ශබ්ද කෝෂයක් හරහා යෙදීම තරමක් මන්දගාමී විය හැකිය. මගේ පරීක්ෂණ වලදී අරාවකට වඩා පුනරාවර්තනයක් තත්පර 0.015003 ක් ගත වූ අතර ශබ්ද කෝෂයක් හරහා (එකම මූලද්‍රව්‍ය සංඛ්‍යාවක් සහිත) තත්පර 0.0365073 තත්පර 2.4 ගුණයක් ගත විය! මම මීට වඩා විශාල වෙනස්කම් දැක ඇතත්. සංසන්දනය කිරීම සඳහා ලැයිස්තුවක් තත්පර 0.00215043 අතර කොතැනක හෝ විය.

කෙසේ වෙතත්, එය ඇපල් හා දොඩම් සංසන්දනය කිරීමක් වැනිය. මගේ අදහස නම් ශබ්ද කෝෂ හරහා නැවත යෙදීම මන්දගාමී බවයි.

ශබ්ද කෝෂ බැලීම සඳහා ප්‍රශස්තිකරණය කර ඇත, එබැවින් එය මනසේ තබාගෙන මම ක්‍රම දෙකක් නිර්මාණය කර ඇත්තෙමි. එක් අයෙකු හුදෙක් පුරෝකථනයක් කරයි, අනෙකා යතුරු නැවත කියවයි.

public static string Normal(Dictionary<string, string> dictionary)
{
    string value;
    int count = 0;
    foreach (var kvp in dictionary)
    {
        value = kvp.Value;
        count++;
    }

    return "Normal";
}

මෙය යතුරු පටවා ඒවා වෙනුවට නැවත ක්‍රියා කරයි (මම යතුරු දාමයකට ඇද ගැනීමට උත්සාහ කළෙමි [] නමුත් වෙනස නොසැලකිලිමත් විය.

public static string Keys(Dictionary<string, string> dictionary)
{
    string value;
    int count = 0;
    foreach (var key in dictionary.Keys)
    {
        value = dictionary[key];
        count++;
    }

    return "Keys";
}

මෙම උදාහරණය සමඟ සාමාන්‍ය foreach පරීක්ෂණය 0.0310062 ක් සහ යතුරු අනුවාදය 0.2205441 ක් ලබා ගත්තේය. සියලුම යතුරු පූරණය කිරීම සහ සියලු බැල්ම නැවත නැවත බැලීම පැහැදිලිවම මන්දගාමී වේ!

අවසාන පරීක්ෂණය සඳහා මෙහි යතුරු භාවිතා කිරීමෙන් යම් ප්‍රයෝජනයක් ඇත්දැයි බැලීමට මම දස වතාවක් මගේ ක්‍රියාවලිය සිදු කර ඇත්තෙමි (මේ වන විට මම කුතුහලයෙන් සිටියෙමි):

සිදුවන්නේ කුමක්ද යන්න දෘශ්‍යමාන කිරීමට එය උදව් කරන්නේ නම් මෙන්න RunTest ක්‍රමය.

private static string RunTest<T>(T dictionary, Func<T, string> function)
{            
    DateTime start = DateTime.Now;
    string name = null;
    for (int i = 0; i < 10; i++)
    {
        name = function(dictionary);
    }
    DateTime end = DateTime.Now;
    var duration = end.Subtract(start);
    return string.Format("{0} took {1} seconds", name, duration.TotalSeconds);
}

මෙහි සාමාන්‍ය foreach ධාවනය සඳහා තත්පර 0.2820564 ක් ගතවිය (එක් පුනරාවර්තනයකට වඩා දස ගුණයක් පමණ දිගු වේ - ඔබ අපේක්ෂා කළ පරිදි). යතුරු හරහා නැවත ධාවනය තත්පර 2.2249449 ක් ගතවිය.

එක් කිරීමට සංස්කරණය කරන ලදි: වෙනත් පිළිතුරු කිහිපයක් කියවීමෙන් මම ශබ්ද කෝෂය වෙනුවට ශබ්දකෝෂය භාවිතා කළහොත් කුමක් සිදුවේදැයි ප්‍රශ්න කළෙමි. මෙම උදාහරණයේ දී අරාව තත්පර 0.0120024 ක් ද, ලැයිස්තුව තත්පර 0.0185037 ක් ද ශබ්දකෝෂය තත්පර 0.0465093 ක් ද ගත විය. ශබ්ද කෝෂය කෙතරම් මන්දගාමීද යන්න මත දත්ත වර්ගය වෙනසක් කරයි යැයි අපේක්ෂා කිරීම සාධාරණ ය.

මගේ නිගමන මොනවාද?

  • ඔබට හැකි නම් ශබ්ද කෝෂයක් හරහා නැවත ක්‍රියා කිරීමෙන් වළකින්න, ඒවා එකම දත්තයක් සහිත අරාවකට වඩා නැවත යෙදීමට වඩා සැලකිය යුතු ලෙස මන්දගාමී වේ.
  • ඔබ ශබ්ද කෝෂයක් හරහා නැවත යෙදීමට තෝරා ගන්නේ නම්, එතරම් දක්ෂ වීමට උත්සාහ නොකරන්න, මන්දගාමී වුවද සම්මත පුරෝකථන ක්‍රමය භාවිතා කිරීමට වඩා නරක දෙයක් කළ හැකිය.


3
කරුණාකර ඔබේ පරීක්ෂණ අවස්ථාව, ඔබේ ශබ්ද කෝෂයේ කොපමණ අයිතම, සාමාන්‍ය කාලය ගණනය කිරීම සඳහා ඔබේ දර්ශනය
කොපමණ වාරයක් ධාවනය කර ඇත්දැයි විස්තර කළ හැකිද

4
ශබ්ද කෝෂයේ ඔබ සතුව ඇති දත්ත අනුව වෙනස් ප්‍රති results ල ඔබට ලැබෙනු ඇත. ශබ්දකෝෂය හරහා නැවත කියවීමේදී ගණන් ගැනීමේ ශ්‍රිතයට ශබ්ද කෝෂයේ හිස් තව් රාශියක් මඟ හැරිය යුතු අතර එය අරාවකට වඩා නැවත යෙදීමට වඩා මන්දගාමී වීමට හේතු වේ. ශබ්දකෝෂය පිරී තිබේ නම් එය අඩක් හිස් වූවාට වඩා මඟ හැරීමට අඩු හිස් තව් ඇත.
මාටින් බ්‍රවුන්

26

විකල්ප ඕනෑ තරම් තිබේ. මගේ පුද්ගලික ප්‍රියතමය KeyValuePair විසිනි

Dictionary<string, object> myDictionary = new Dictionary<string, object>();
// Populate your dictionary here

foreach (KeyValuePair<string,object> kvp in myDictionary)
{
     // Do some interesting things
}

ඔබට යතුරු සහ වටිනාකම් එකතුවද භාවිතා කළ හැකිය


15

සමග .NET Framework 4.7භාවිතා කළ හැකි විසංයෝජනය

var fruits = new Dictionary<string, int>();
...
foreach (var (fruit, number) in fruits)
{
    Console.WriteLine(fruit + ": " + number);
}

මෙම කේතය අඩු C # අනුවාද වල වැඩ කිරීමට, System.ValueTuple NuGet packageකොතැනක හෝ එකතු කර ලියන්න

public static class MyExtensions
{
    public static void Deconstruct<T1, T2>(this KeyValuePair<T1, T2> tuple,
        out T1 key, out T2 value)
    {
        key = tuple.Key;
        value = tuple.Value;
    }
}

9
මෙය වැරදිය. .NET 4.7 සරලව ValueTupleගොඩනගා ඇත. එය පෙර සංස්කරණ සඳහා නූගට් පැකේජයක් ලෙස ලබා ගත හැකිය. වැදගත්ම දෙය නම්, C # 7.0+ Deconstructක්‍රමය සඳහා විසංයෝජකයෙකු ලෙස වැඩ කිරීමට අවශ්‍ය වේ var (fruit, number) in fruits.
ඩේවිඩ් ආර්නෝ

13

C # 7 වන විට, ඔබට වස්තූන් විචල්යයන් බවට පත් කළ හැකිය. ශබ්ද කෝෂයක් හරහා නැවත කියවීමට මෙය හොඳම ක්‍රමය යැයි මම විශ්වාස කරමි.

උදාහරණයක්:

KeyValuePair<TKey, TVal>එය විසංයෝජනය කරන විස්තාරණ ක්‍රමයක් සාදන්න :

public static void Deconstruct<TKey, TVal>(this KeyValuePair<TKey, TVal> pair, out TKey key, out TVal value)
{
   key = pair.Key;
   value = pair.Value;
}

Dictionary<TKey, TVal>පහත දැක්වෙන ආකාරයට ඕනෑම දෙයක් ගැන කතා කරන්න

// Dictionary can be of any types, just using 'int' and 'string' as examples.
Dictionary<int, string> dict = new Dictionary<int, string>();

// Deconstructor gets called here.
foreach (var (key, value) in dict)
{
   Console.WriteLine($"{key} : {value}");
}

10

නැවත සැකසීමට ඔබ පහත යෝජනා කළේය

Dictionary<string,object> myDictionary = new Dictionary<string,object>();
//Populate your dictionary here

foreach (KeyValuePair<string,object> kvp in myDictionary) {
    //Do some interesting things;
}

FYI, foreachඅගය වර්ගයේ වස්තුවක් නම් ක්‍රියා නොකරයි.


4
කරුණාකර විස්තාරනය කරන්න: කුමන අගයක් foreachතිබේ නම් එය ක්‍රියා නොකරනු ඇත object? එසේ නොමැතිනම් මෙය එතරම් තේරුමක් නැත.
මාක් එල්.

9

ශබ්ද කෝෂයක් පුනරාවර්තනය කිරීම සඳහා සරලම ආකෘතිය:

foreach(var item in myDictionary)
{ 
    Console.WriteLine(item.Key);
    Console.WriteLine(item.Value);
}

9

C # 7 භාවිතා කරමින් , ඔබේ විසඳුමේ ඕනෑම ව්‍යාපෘතියකට මෙම දිගු කිරීමේ ක්‍රමය එක් කරන්න:

public static class IDictionaryExtensions
{
    public static IEnumerable<(TKey, TValue)> Tuples<TKey, TValue>(
        this IDictionary<TKey, TValue> dict)
    {
        foreach (KeyValuePair<TKey, TValue> kvp in dict)
            yield return (kvp.Key, kvp.Value);
    }
}


මෙම සරල වාක්‍ය ඛණ්ඩය භාවිතා කරන්න

foreach (var(id, value) in dict.Tuples())
{
    // your code using 'id' and 'value'
}


නැත්නම් මේ එකක්, ඔබ කැමති නම්

foreach ((string id, object value) in dict.Tuples())
{
    // your code using 'id' and 'value'
}


සාම්ප්‍රදායික වෙනුවට

foreach (KeyValuePair<string, object> kvp in dict)
{
    string id = kvp.Key;
    object value = kvp.Value;

    // your code using 'id' and 'value'
}


දීර් extension කිරීමේ ක්‍රමය KeyValuePairඔබේ IDictionary<TKey, TValue>දැඩි ලෙස ටයිප් කළ බවට පරිවර්තනය කරයිtuple කරයි, මෙම නව සුව පහසු වාක්‍ය ඛණ්ඩය භාවිතා කිරීමට ඔබට ඉඩ සලසයි.

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

කෙලින්ම tupleභාවිතා KeyValuePairකිරීම හා සැසඳීමේ දී දිගුවක් නිර්මාණය කිරීම සඳහා සුළු පිරිවැයක් ඇත, ඔබ කෙසේ හෝ KeyValuePairගුණාංග Keyහා Valueනව ලූප් විචල්‍යයන් ලබා දෙන්නේ නම් එය ගැටළුවක් නොවිය යුතුය .

ප්‍රායෝගිකව, මෙම නව වාක්‍ය ඛණ්ඩය බොහෝ අවස්ථාවන් සඳහා ඉතා හොඳින් ගැලපේ, පහත් මට්ටමේ අතිශය ඉහළ කාර්ය සාධන අවස්ථා හැරුණු විට, එම නිශ්චිත ස්ථානයේ එය භාවිතා නොකිරීමට ඔබට තවමත් විකල්පයක් ඇත.

මෙය පරීක්ෂා කරන්න: MSDN බ්ලොග් - C # 7 හි නව විශේෂාංග


1
යතුරු-වටිනාකම් යුගලවලට වඩා 'සුවපහසු' ටුපල් වලට වැඩි කැමැත්තක් දැක්වීමට හේතුව කුමක්ද? මට මෙහි වාසියක් නොපෙනේ. ඔබගේ ටුපල් එකේ යතුරක් සහ අගයක් අඩංගු වන අතර යතුරු-අගය-යුගලයද ඇත.
මාර්ටන්

4
හායි මාර්ටන්, ඔබේ ප්‍රශ්නයට ස්තූතියි. ප්‍රධාන වාසිය වන්නේ අතිරේක ක්‍රමලේඛන උත්සාහයකින් තොරව කේත කියවීමේ හැකියාවයි. KeyValuePair එක හැම විටම ආකෘති පත්රය භාවිතා කළ යුතු kvp.Keyහා kvp.Valueපිළිවෙළින් ප්රධාන සහ අගය භාවිතා කිරීම සඳහා. පුරෝකථන කොටස තුළ තවදුරටත් විචල්‍ය ප්‍රකාශ භාවිතා නොකර, යතුර සහ වටිනාකම ඔබට අවශ්‍ය පරිදි නම් කිරීමට නම්‍යශීලී බවක් ඔබට ලැබේ. උදා: ඔබට ඔබේ යතුර ලෙස නම් කළ හැකිය factoryName, සහ වටිනාකම models, ඔබ කූඩු ලූප (ශබ්ද කෝෂවල ශබ්ද කෝෂ) ලබා ගන්නා විට විශේෂයෙන් ප්‍රයෝජනවත් වේ: කේත නඩත්තු කිරීම වඩාත් පහසු වේ. එය උත්සාහ කර බලන්න! ;-)
sɐunıɔ ןɐ qɐp

7

මෙය ඉතා පැරණි ප්‍රශ්නයක් බව මම දනිමි, නමුත් ප්‍රයෝජනවත් විය හැකි ව්‍යාප්ති ක්‍රම කිහිපයක් මම නිර්මාණය කළෙමි:

    public static void ForEach<T, U>(this Dictionary<T, U> d, Action<KeyValuePair<T, U>> a)
    {
        foreach (KeyValuePair<T, U> p in d) { a(p); }
    }

    public static void ForEach<T, U>(this Dictionary<T, U>.KeyCollection k, Action<T> a)
    {
        foreach (T t in k) { a(t); }
    }

    public static void ForEach<T, U>(this Dictionary<T, U>.ValueCollection v, Action<U> a)
    {
        foreach (U u in v) { a(u); }
    }

මේ ආකාරයෙන් මට මේ වගේ කේත ලිවිය හැකිය:

myDictionary.ForEach(pair => Console.Write($"key: {pair.Key}, value: {pair.Value}"));
myDictionary.Keys.ForEach(key => Console.Write(key););
myDictionary.Values.ForEach(value => Console.Write(value););

6

සමහර විට ඔබට ගණනය කිරීමට අවශ්‍ය වන්නේ අගයන් පමණක් නම්, ශබ්ද කෝෂයේ අගය එකතු කිරීම භාවිතා කරන්න:

foreach(var value in dictionary.Values)
{
    // do something with entry.Value only
}

එය වේගවත්ම ක්‍රමය බව සඳහන් කරන මෙම ලිපිය මගින් වාර්තා කර ඇත: http://alexpinsker.blogspot.hk/2010/02/c-fastest-way-to-iterate-over.html


කාර්ය සාධනය ගෙන ඒම සඳහා +1. ඇත්ත වශයෙන්ම, ඔබට අවශ්‍ය සියල්ල අගයන් නම්, ශබ්දකෝෂය හරහා නැවත යෙදීම සඳහා යම් පොදු කාර්යයක් ඇතුළත් වේ. එය බොහෝ දුරට සිදුවන්නේ KeyValuePair ව්‍යුහයන් වෙත අගයන් හෝ යොමු කිරීම් පිටපත් කිරීම හේතුවෙනි.
ජානුස් වරස්

1
FYI එම සබැඳියේ අවසාන පරීක්ෂණය වැරදි දෙයයි: එය යතුරු හරහා නැවත ක්‍රියා කිරීම, අගයන් නොසලකා හැරීම මනිනු ලබන අතර පෙර පරීක්ෂණ දෙකෙහි අගය භාවිතා වේ.
ක්‍රෙසන්ට් ෆ්‍රෙෂ්

5

MSDN හි ශබ්ද කෝෂ පංතිය සඳහා වන ප්‍රලේඛනය තුළ මෙම ක්‍රමය මට හමු විය:

foreach (DictionaryEntry de in myDictionary)
{
     //Do some stuff with de.Value or de.Key
}

ශබ්දකෝෂ කඳවුරෙන් උරුම වූ පන්තියක නිවැරදිව ක්‍රියා කිරීමට මට හැකි වූයේ මෙයයි.


3
ශබ්ද කෝෂයේ ජනක නොවන අනුවාදය භාවිතා කරන විට මෙය පෙනේ ... එනම් .NET රාමුව 2.0 ට පෙර.
joedotnot

@ joed0tnot: එය Hashtableවස්තූන් සඳහා භාවිතා කරන
ජනක නොවන අනුවාදයයි

5

foreach වේගවත් වන අතර ඔබ නැවත නැවත කළහොත් පමණි ___.Values නැවත නැවත කියනවා නම් එයද වේගවත් වේ

රූප විස්තරය මෙහි ඇතුළත් කරන්න


1
ඇයි ඔයා කතාකරන්නේ ContainsKey()තුළ forඅනුවාදය? එය ඔබ සංසන්දනය කරන කේතයේ නොමැති අමතර පොදු කාර්ය එකතු කරයි. TryGetValue()එම නිශ්චිත "යතුර තිබේ නම්, යතුර සමඟ අයිතමය ලබා ගන්න" රටාව ප්‍රතිස්ථාපනය කිරීමට පවතී. තව දුරටත්, dictසිට පූර්ණ සංඛ්‍යා පරාසයක් තිබේ 0නම් dictCount - 1, දර්ශකය අසමත් විය නොහැකි බව ඔබ දන්නවා; එසේ නොවුවහොත්, dict.Keysඔබ නැවත කියවිය යුත්තේ එයයි. කෙසේ හෝ නැත ContainsKey()/ TryGetValue()අවශ්‍ය නොවේ. අවසාන වශයෙන්, කරුණාකර කේතයේ තිරපිටපත් පළ නොකරන්න.
BACON

3

මම .NET 4.0+ හි වාසිය ලබා ගෙන මුලින් පිළිගත් පිළිතුරට යාවත්කාලීන පිළිතුරක් ලබා දෙන්නෙමි:

foreach(var entry in MyDic)
{
    // do something with entry.Value or entry.Key
}

3

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

foreach (DictionaryEntry entry in myDictionary)
{
     //Read entry.Key and entry.Value here
}

2

මම ශබ්ද කෝෂයක් හරහා ලූපයක් දිගු කළෙමි.

public static class DictionaryExtension
{
    public static void ForEach<T1, T2>(this Dictionary<T1, T2> dictionary, Action<T1, T2> action) {
        foreach(KeyValuePair<T1, T2> keyValue in dictionary) {
            action(keyValue.Key, keyValue.Value);
        }
    }
}

එවිට ඔබට ඇමතිය හැකිය

myDictionary.ForEach((x,y) => Console.WriteLine(x + " - " + y));

ඔබ සතුව ඇති ForEachක්‍රමවේදයක් ඔබ අර්ථ දක්වා ඇත foreach (...) { }... අනවශ්‍ය යැයි පෙනේ.
මාර්ටන්

1

පෙරනිමියෙන් ඔබට වටිනාකම් එකතු කිරීමට අවශ්‍ය නම්, ඔබට IEnumerable <> ක්‍රියාත්මක කළ හැකි යැයි මම විශ්වාස කරමි, එහිදී T යනු ශබ්ද කෝෂයේ ඇති වටිනාකම් වස්තුවේ වර්ගය වන අතර “මෙය” ශබ්දකෝෂයකි.

public new IEnumerator<T> GetEnumerator()
{
   return this.Values.GetEnumerator();
}

1

මෙම පිළිතුරෙහි දැනටමත් පෙන්වා දී ඇති පරිදි , KeyValuePair<TKey, TValue>aDeconstruct .NET Core 2.0, .NET සම්මත 2.1 හා .NET Framework 5.0 (පෙරදසුනෙහි) වන දින ආරම්භ ක්රමය.

මේ සමඟ, අ KeyValuePairnost ෙයවාදී ආකාරයකින් ශබ්ද කෝෂයක් හරහා නැවත කියවිය හැකිය :

var dictionary = new Dictionary<int, string>();

// ...

foreach (var (key, value) in dictionary)
{
    // ...
}

0
var dictionary = new Dictionary<string, int>
{
    { "Key", 12 }
};

var aggregateObjectCollection = dictionary.Select(
    entry => new AggregateObject(entry.Key, entry.Value));

2
මෙම පිළිතුරෙහි වඩාත් සාධාරණීකරණය / විස්තරයක් තිබිය යුතුය. AggregateObjectඑකතු කරන්නේ කුමක් ද KeyValuePair? ප්‍රශ්නයේ දී ඉල්ලා ඇති පරිදි "පුනරාවර්තනය" කොහිද?
මාක් එල්.

ශබ්ද කෝෂයට වඩා පුනරාවර්තනය තෝරන්න සහ එක් එක් වස්තුව මත වැඩ කිරීමට අපට ඉඩ දෙයි. එය එතරම් සාමාන්‍ය නොවේ foreach, නමුත් මම එය බොහෝ භාවිතා කර ඇත. මගේ පිළිතුර සැබවින්ම පහත් කොට සැලකීමට සුදුසුද?
පික්සාර්

නැත, ප්‍රති result ලය බලපැවැත්වීම සඳහා නැවත Select භාවිතා කිරීම භාවිතා කරයි , නමුත් එය අනුකාරකයක් නොවේ. පුනරාවර්තනය ( foreach) සඳහා භාවිතා කරන දේවල් - විශේෂයෙන් අතුරු ආබාධ සහිත මෙහෙයුම් - ඇතුළුව ලින්ක් විෂය පථයෙන් පිටත Selectවේ. aggregateObjectCollectionසැබවින්ම ගණන් ගන්නා තෙක් ලැම්බඩා ක්‍රියාත්මක නොවේ . මෙම පිළිතුර "පළමු මාවත" ලෙස ගතහොත් (එනම්, කෙළින්ම භාවිතා කිරීමට පෙර foreach) එය නරක පුරුදු දිරිගන්වයි. කාලානුරූපව , ශබ්ද කෝෂයක් නැවත යෙදීමට පෙර ලින්ක් මෙහෙයුම් ප්‍රයෝජනවත් විය හැකි නමුත් එය ඇසූ පරිදි ප්‍රශ්නයට ආමන්ත්‍රණය නොකරයි.
මාක් එල්.

0

මගේ ශත 2 එකතු කිරීමට අවශ්‍ය වූ නිසා, බොහෝ පිළිතුරු foreach-loop හා සම්බන්ධ වේ. කරුණාකර, පහත කේතය දෙස බලන්න:

Dictionary<String, Double> myProductPrices = new Dictionary<String, Double>();

//Add some entries to the dictionary

myProductPrices.ToList().ForEach(kvP => 
{
    kvP.Value *= 1.15;
    Console.Writeline(String.Format("Product '{0}' has a new price: {1} $", kvp.Key, kvP.Value));
});

මෙය '.ToList ()' හි අතිරේක ඇමතුමක් එක් කරයි, සුළු කාර්ය සාධනයක්-වැඩිදියුණු කිරීමක් තිබිය හැකිය (මෙහි පෙන්වා ඇති පරිදි someList.Foreach () vs} ), espacially විශාල ශබ්ද කෝෂ සමඟ වැඩ කරන හා සමගාමීව ක්රියාත්මක වන විටදී නැත විකල්පය / කිසිසේත්ම බලපෑමක් ඇති නොකරනු ඇත.

තවද, පුරෝකථන ලූපයක් තුළ ඇති 'අගය' දේපල සඳහා අගයන් පැවරීමට ඔබට නොහැකි බව කරුණාවෙන් සලකන්න. අනෙක් අතට, ඔබට 'යතුර' හැසිරවීමට හැකි වනු ඇත, සමහර විට ධාවන වේලාවේදී ඔබව කරදරයට පත් කරනු ඇත.

ඔබට යතුරු සහ අගයන් "කියවීමට" අවශ්‍ය වූ විට, ඔබට IEnumerable භාවිතා කළ හැකිය. තෝරන්න ().

var newProductPrices = myProductPrices.Select(kvp => new { Name = kvp.Key, Price = kvp.Value * 1.15 } );

5
සියලු දී කිසිදු හේතුවක් සඳහා සමස්ත එකතුව පිටපත් ඇත නොහැකි කාර්ය සාධනය වැඩි දියුණු. එය කේතය නාටකාකාර ලෙස මන්දගාමී කරයි, එසේම අතිරේක මතකයක් නැති පරිභෝජනය කළ යුතු කේතයේ මතක අඩිපාර දෙගුණ කරයි.
සර්වි

අතුරු ආබාධ 'List.ForEach' ක්‍රමයෙන් මම වැළකී සිටිමි: foreachඅතුරු ආබාධ දෘශ්‍යතාව එය අයිති තැනට බල කරයි.
පරිශීලක 2864740

0

ශබ්දකෝෂය <TKey, TValue> එය c # හි සාමාන්‍ය එකතු කිරීමේ පන්තියක් වන අතර එය දත්ත යතුරු අගය ආකෘතියේ ගබඩා කරයි. කේ අද්විතීය විය යුතු අතර එය ශුන්‍ය විය නොහැකි අතර අගය අනුපිටපත් හා ශුන්‍ය විය හැකිය. යතුරක් සහ එහි වටිනාකම නිරූපණය කරන KeyValuePair <TKey, TValue> ව්‍යුහය ලෙස සලකනු ලැබේ. එබැවින් මූලද්‍රව්‍යය පුනරාවර්තනය කිරීමේදී අපි KeyValuePair <TKey, TValue> යන මූලද්‍රව්‍ය වර්ගය ගත යුතුය. පහත උදාහරණය.

Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1,"One");
dict.Add(2,"Two");
dict.Add(3,"Three");

foreach (KeyValuePair<int, string> item in dict)
{
    Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value);
}

-1

ඔබට ලූප් සඳහා භාවිතා කිරීමට අවශ්‍ය නම්, ඔබට මෙය කළ හැකිය:

var keyList=new List<string>(dictionary.Keys);
for (int i = 0; i < keyList.Count; i++)
{
   var key= keyList[i];
   var value = dictionary[key];
 }

නමුත් මෙහි ඇති ප්‍රයෝජනය කුමක්ද? එය වඩා දිගු කේතය තියෙන්නේ foreachපුඩුවක් හා නිසා වඩාත් නරක අතට ක්රියාකාරීත්වය new List<string>(dictionary.Keys)වඩාත් කැපීපෙනේ ඇත dictionary.Countඔබ පවා එය ඔබම වඩාත් කැපීපෙනේ අවස්ථාවක් තියෙනවා පෙර වතාවක්. “හොඳම ක්‍රමය” ඉල්ලීම ආත්මීය බව පසෙකට දැමීමෙන්, ප්‍රශ්නය සොයන “හොඳම ක්‍රමය” හෝ “සම්මත ක්‍රමය” ලෙස මෙය සුදුසුකම් ලබන්නේ කෙසේදැයි මම නොදනිමි. "ඔබට ලූප් සඳහා භාවිතා කිරීමට අවශ්‍ය නම් ..." වෙත " ලූපයක් භාවිතා නොකරන්න " යන්නට මම විරුද්ධ වෙමි for.
බේකන්

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

"එකතු කිරීම වෙනස් කරන ලදි" ව්‍යතිරේකයන් මග හැරීම මෙය කිරීමට එක් හේතුවක් බව මම එකඟ වෙමි, නමුත් එම විශේෂ අවස්ථාව ප්‍රශ්නයේ සඳහන් නොවූ අතර කෙනෙකුට සෑම විටම කළ foreach (var pair in dictionary.ToArray()) { }හැකිය. කෙසේ වෙතත්, මෙම කේතය භාවිතා කිරීමට යමෙකුට අවශ්‍ය වන නිශ්චිත අවස්ථා (ය) සහ එසේ කිරීමේ ඇඟවුම් පිළිතුරෙන් පැහැදිලි කිරීම හොඳ යැයි මම සිතමි.
බේකන්

ඔව් ඔබ හරි නමුත් මෙහි ElementAt සමඟ පිළිතුරක් ඇති අතර එයට ඉතා ඉහළ කීර්තියක් ඇති අතර මම මෙම පිළිතුර ඇතුළත්
කළෙමි

-2

ලින්ක් සමඟ සරලයි

 Dictionary<int, string> dict = new Dictionary<int, string>();
 dict.Add(1, "American Ipa");
 dict.Add(2, "Weiss");
 dict.ToList().ForEach(x => Console.WriteLine($"key: {x.Key} | value: {x.Value}") );

ඔබ අමතන්නේ පන්තියේ පමණක් අර්ථ දක්වා ඇති ToList()නිසා බව මට පෙනේ , නමුත් සාධාරණ වෙනුවට ඒ සියල්ල කරන්නේ ඇයි ? මම කියන්නේ එය ඊටත් වඩා සරල වන අතර එකම මතකයක් / කාර්ය සාධනයක් නොමැති බවයි. මෙම පිළිතුරෙහි මීට වසර 3.5 කට පෙර සිට කෙසේ හෝ මෙම නිශ්චිත විසඳුම දැනටමත් යෝජනා කර ඇත . ForEach()List<>foreach (var pair in dict) { }
BACON

කේත දෘශ්‍යකරණය සඳහා, එය ඔබ සඳහන් කළ ආකාරයටම කළ හැකිය, මට එය වෙනත් ආකාරයකින් ඉදිරිපත් කිරීමට අවශ්‍ය වූ අතර මගේ සිහින් දෘෂ්ටිය අනුව, පිළිතුර සඳහන් නොකිරීම ගැන මම සමාව
අයදිමි

-4

භාවිතා කිරීම අතර සාකච්ඡාවක් පවතින ඉහළම තනතුරු වලට අමතරව

foreach(KeyValuePair<string, string> entry in myDictionary)
{
    // do something with entry.Value or entry.Key
}

හෝ

foreach(var entry in myDictionary)
{
    // do something with entry.Value or entry.Key
}

ආරම්භයේ සිටම ශබ්ද කෝෂ වර්ගය ඔබට දැකිය හැකි බැවින් වඩාත් සම්පූර්ණ වන්නේ පහත දැක්වේ, kvp යනු KeyValuePair ය

var myDictionary = new Dictionary<string, string>(x);//fill dictionary with x

foreach(var kvp in myDictionary)//iterate over dictionary
{
    // do something with kvp.Value or kvp.Key
}

5
දෙවන ශබ්ද කෝෂයක් නිර්මාණය කිරීම සහ පිටපත් කිරීම කේත කියවීමේ හැකියාව සඳහා වලංගු විසඳුමක් නොවේ. ඇත්ත වශයෙන්ම, කේතය තේරුම් ගැනීමට අපහසු වනු ඇතැයි මම තර්ක කරමි, මන්ද දැන් ඔබ ඔබගෙන්ම මෙසේ අසාගත යුතුය: "අන්තිම පුද්ගලයා දෙවන ශබ්දකෝෂයක් නිර්මාණය කළේ ඇයි?" ඔබට වඩාත් වාචික වීමට අවශ්‍ය නම්, විකල්පය එකක් භාවිතා කරන්න.
මැතිව් ගූලාර්ට්

මම ඔබට පෙන්වීමට අදහස් කළේ එක් එක් දේ සඳහා පෙර ප්‍රතික්ෂේප කළ විට, ප්‍රකාශයේ
භාවිතයෙන්
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.