මගේ වැඩසටහන් සැලසුම් කිරීමේදී, මම බොහෝ විට එවැනි සිතුවිලි දාමයකින් ආරම්භ කරමි:
පාපන්දු කණ්ඩායමක් යනු පාපන්දු ක්රීඩකයින්ගේ ලැයිස්තුවක් පමණි. එබැවින්, මම එය නියෝජනය කළ යුත්තේ:
var football_team = new List<FootballPlayer>();මෙම ලැයිස්තුවේ අනුපිළිවෙල නිරූපණය කරන්නේ ක්රීඩකයන් ලැයිස්තුවේ ලැයිස්තුගත කර ඇති අනුපිළිවෙලයි.
නමුත් ක්රීඩකයන්ගේ ලැයිස්තුවට අමතරව කණ්ඩායම් වලට වෙනත් දේපලද ඇති බව මම පසුව තේරුම් ගතිමි. උදාහරණයක් ලෙස, මෙම කන්නයේ ධාවනය වන මුළු ලකුණු, වත්මන් අයවැය, ඒකාකාර වර්ණ, stringකණ්ඩායමේ නම නියෝජනය කරන ආදිය.
ඉතින් මම හිතන්නේ:
හරි, පාපන්දු කණ්ඩායමක් යනු ක්රීඩකයන්ගේ ලැයිස්තුවකට සමානය, නමුත් ඊට අමතරව, එයට නමක් (අ
string) සහ ධාවනය වන මුළු ලකුණු (අint) ඇත. .නෙට් පාපන්දු කණ්ඩායම් ගබඩා කිරීම සඳහා පන්තියක් සපයන්නේ නැත, එබැවින් මම මගේම පන්තියක් සාදමි. වඩාත්ම සමාන හා අදාළ පවත්නා ව්යුහයList<FootballPlayer>, එබැවින් මම එයින් උරුම වෙමි:class FootballTeam : List<FootballPlayer> { public string TeamName; public int RunningTotal }
නමුත් ඔබට උරුම නොවිය යුතු යැයි මාර්ගෝපදේශයක් පවසන බවList<T> පෙනේ. මෙම මාර්ගෝපදේශය කාරණා දෙකකින් මම තරයේ ව්යාකූල වී සිටිමි.
ඇයි නැත්තේ?
පෙනෙන විදිහට Listකෙසේ හෝ කාර්ය සාධනය සඳහා ප්රශස්තිකරණය කර ඇත. එහෙම කොහොම ද? මා දිගු කළහොත් මා හට ඇති කාර්ය සාධන ගැටලු Listමොනවාද? හරියටම බිඳී යන්නේ කුමක් ද?
මා දුටු තවත් හේතුවක් නම් Listඑය මයික්රොසොෆ්ට් විසින් සපයනු ලබන අතර මට එය පාලනය කළ නොහැකි බැවින් "පොදු API" එකක් හෙළි කිරීමෙන් පසුව මට එය පසුව වෙනස් කළ නොහැක . නමුත් මම මෙය තේරුම් ගැනීමට වෙහෙසෙනවා. පොදු API යනු කුමක්ද සහ මා සැලකිලිමත් විය යුත්තේ ඇයි? මගේ වර්තමාන ව්යාපෘතියෙහි මෙම පොදු ඒපීඅයි නොමැති නම් සහ නොමැති නම්, මට මෙම මාර්ගෝපදේශය ආරක්ෂිතව නොසලකා හැරිය හැකිද? මට උරුම වී ඇත්නම් List සහ මට පොදු API එකක් අවශ්ය බව පෙනේ නම්, මට ඇති දුෂ්කරතා මොනවාද?
එය පවා වැදගත් වන්නේ ඇයි? ලැයිස්තුවක් යනු ලැයිස්තුවකි. වෙනස් විය හැකි දේ කුමක්ද? මට වෙනස් කිරීමට අවශ්ය විය හැක්කේ කුමක්ද?
අවසාන වශයෙන්, මයික්රොසොෆ්ට් මට උරුම කර ගැනීමට Listඅකමැති නම්, ඔවුන් පන්තිය සෑදුවේ නැත්තේ ඇයි sealed?
මා භාවිතා කිරීමට බලාපොරොත්තු වන්නේ කුමක්ද?
පෙනෙන ආකාරයට, අභිරුචි එකතු කිරීම් සඳහා, මයික්රොසොෆ්ට් විසින් Collectionපන්තියක් ලබා දී ඇති අතර ඒ වෙනුවට දීර් extended කළ යුතුය List. නමුත් මෙම පංතිය ඉතා හිස් ය, උදාහරණයක් ලෙසAddRange බොහෝ ප්රයෝජනවත් දේ නොමැත . jvitor83 හි පිළිතුර එම විශේෂිත ක්රමයට කාර්ය සාධන තාර්කිකත්වයක් සපයයි, නමුත් මන්දගාමී AddRangeවීම වඩා හොඳ නොවන්නේ AddRangeකෙසේද?
උරුම කර ගැනීමට Collectionවඩා වැඩ කිරීම උරුම කර ගැනීම වන අතර Listඑයින් කිසිදු ප්රයෝජනයක් මට නොපෙනේ. නිසැකවම මයික්රොසොෆ්ට් කිසිදු හේතුවක් නොමැතිව අමතර වැඩක් කිරීමට මට නොකියනු ඇත, එබැවින් මා යම් දෙයක් වරදවා වටහාගෙන ඇති බවක් හැඟීමට මට උදව් කළ නොහැක, සහ උරුම කර Collectionගැනීම ඇත්ත වශයෙන්ම මගේ ගැටලුවට නිවැරදි විසඳුම නොවේ.
ක්රියාත්මක කිරීම වැනි යෝජනා මම දැක ඇත්තෙමි IList. නැහැ. මෙය බොයිලර් ප්ලේට් කේත පේළි දුසිම් ගණනක් වන අතර එය මට කිසිවක් නොලැබේ.
අවසාන වශයෙන්, සමහරු Listයමක් ඔතා තැබීමට යෝජනා කරති :
class FootballTeam
{
public List<FootballPlayer> Players;
}
මේ සමඟ ගැටළු දෙකක් තිබේ:
එය මගේ කේතය අනවශ්ය ලෙස වාචික කරයි. මම දැන්
my_team.Players.Countසාධාරණ ලෙස කතා කළ යුතුයිmy_team.Count. ස්තුතිවන්ත වන්න, සී # සමඟ මට සුචිගත කිරීම විනිවිද පෙනෙන ලෙස අර්ථ දැක්විය හැකි අතර අභ්යන්තරයේ සියලු ක්රම ඉදිරියට යොමු කළ හැකියList... නමුත් එය කේත ගොඩක්! ඒ සියලු වැඩ සඳහා මට ලැබෙන්නේ කුමක්ද?එය සරල තේරුමක් නැති දෙයක්. පාපන්දු කණ්ඩායමකට ක්රීඩකයන්ගේ ලැයිස්තුවක් නොමැත. එය වේ ක්රීඩකයන් ලැයිස්තුව. "ජෝන් මැක්ෆූට්බොලර් සොම්ටීම් හි ක්රීඩකයන් සමඟ එකතු වී ඇත" යැයි ඔබ නොකියයි. ඔබ කියනවා "ජෝන් සොම්ටීම් සමඟ සම්බන්ධ වී ඇති". ඔබ "නූලක අක්ෂර" වලට ලිපියක් එක් නොකරයි, ඔබ නූලකට ලිපියක් එක් කරයි. ඔබ පුස්තකාලයක පොත් වලට පොතක් එක් නොකරයි, ඔබ පුස්තකාලයකට පොතක් එක් කරයි.
"කබාය යටතේ" සිදුවන්නේ "Y හි අභ්යන්තර ලැයිස්තුවට X එකතු කිරීම" යැයි පැවසිය හැකි බව මට වැටහී ඇත, නමුත් මෙය ලෝකය ගැන සිතීමේ ඉතා ප්රති-බුද්ධිමය ක්රමයක් සේ පෙනේ.
මගේ ප්රශ්නය (සාරාංශගත)
මොන දත්ත ව්යුහය නියෝජනය නිවැරදි C # මාර්ගය ( "මිනිස් මනසේ" කියන්න බව) වන, "තර්කානුකූලව", යනු හුදෙක් අය listක thingsවන සීනුව හා නලා කිහිපයක් සමඟ?
උරුම කර ගැනීම List<T>සැමවිටම පිළිගත නොහැකිද? එය පිළිගත හැක්කේ කවදාද? ඇයි / ඇයි නැත්තේ? උරුම කර ගත යුතුද නැද්ද යන්න තීරණය කිරීමේදී ක්රමලේඛකයෙකු සලකා බැලිය යුත්තේ List<T>කුමක්ද?
stringසඳහා සෑම දෙයක්ම කිරීමට අවශ්ය වේ objectකරන්න පුළුවන් තවත් .

