Func <T> ට වඩා ඔබ ප්‍රකාශනය <Func <T>> භාවිතා කරන්නේ ඇයි?


968

මට ලැම්බඩාස් Funcසහ Actionනියෝජිතයන් තේරෙනවා . නමුත් ප්‍රකාශන මට බාධා කරයි.

Expression<Func<T>>සාමාන්‍ය පැරණි තත්වයට වඩා ඔබ භාවිතා කරන්නේ කුමන තත්වයන් යටතේද Func<T>?


14
C <සම්පාදක මට්ටමින් Func <> ක්‍රමයක් බවට පරිවර්තනය වේ, ප්‍රකාශනය <Func <>> කේතය කෙලින්ම සම්පාදනය කිරීමෙන් පසු MSIL මට්ටමින් ක්‍රියාත්මක වේ, එය වේගවත් වීමට හේතුව එයයි
වලීඩ් ඒකේ

1
පිළිතුරු වලට අමතරව, "4.6 ප්‍රකාශන ගස් වර්ග" යන csharp භාෂා පිරිවිතර හරස් යොමු කිරීම සඳහා උපකාරී වේ
djeikyb

Answers:


1152

ඔබට ලැම්බඩා ප්‍රකාශන ප්‍රකාශන ගස් ලෙස සැලකීමට අවශ්‍ය වූ විට ඒවා ක්‍රියාත්මක කිරීම වෙනුවට ඒවා දෙස බලන්න. උදාහරණයක් ලෙස, SQL වෙත LINQ මඟින් ප්‍රකාශනය ලබාගෙන එය සමාන SQL ප්‍රකාශයක් බවට පරිවර්තනය කර සේවාදායකයට ඉදිරිපත් කරයි (ලැම්බඩා ක්‍රියාත්මක කරනවාට වඩා).

සංකල්පමය, Expression<Func<T>>සම්පූර්ණයෙන්ම වෙනස් සිට Func<T>. Func<T>එය හැඳින්වේ delegateඑච්චරමයි ගැනීමට ක්රමයක් අවධානය යොමුකළ අතර වන Expression<Func<T>>යම් සතුටයි ගසක් දත්ත ව්යුහය සඳහා ලැම්ඩා ප්රකාශනය සඳහා. මෙම ගස් ව්‍යුහය විස්තර කරන්නේ ලැම්බඩා ප්‍රකාශනය සත්‍ය දේ කරනවාට වඩා කරන දෙයයි. එය මූලික වශයෙන් ප්‍රකාශනවල සංයුතිය, විචල්‍යයන්, ක්‍රම ඇමතුම්, ... (උදාහරණයක් ලෙස මෙම ලැම්බඩා වැනි නියත + සමහර පරාමිතීන් වැනි තොරතුරු දරයි). ඔබට මෙම විස්තරය සත්‍ය ක්‍රමයක් බවට පරිවර්තනය කිරීමට (සමඟ Expression.Compile) හෝ වෙනත් දේවල් (LINQ සිට SQL උදාහරණය දක්වා) කළ හැකිය. ලැම්බඩාස් නිර්නාමික ක්‍රම සහ ප්‍රකාශන ගස් ලෙස සැලකීමේ ක්‍රියාව තනිකරම සම්පාදනය කරන කාලයකි.

Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }

කිසිවක් ලබා නොගෙන 10 ආපසු ලබා දෙන IL ක්‍රමයකට effectively ලදායී ලෙස සම්පාදනය කරනු ඇත.

Expression<Func<int>> myExpression = () => 10;

පරාමිතීන් නොලැබෙන සහ 10 අගය ලබා දෙන ප්‍රකාශනයක් විස්තර කරන දත්ත ව්‍යුහයක් බවට පරිවර්තනය වේ:

ප්‍රකාශනය එදිරිව Func විශාල රූපය

සම්පාදක වේලාවේදී ඔවුන් දෙදෙනාම එක හා සමානව පෙනුනද, සම්පාදකයා ජනනය කරන දෙය මුළුමනින්ම වෙනස් වේ.


99
එබැවින්, වෙනත් වචන වලින් කිවහොත්, Expressionඑක්තරා නියෝජිතයෙකු පිළිබඳ මෙටා තොරතුරු අඩංගු වේ.
බර්ට්ල්

44
@bertl ඇත්තටම, නැත. නියෝජිතයා කිසිසේත් සම්බන්ධ නොවේ. නියෝජිතයෙකු සමග සියලු ඕනෑම සංගමය තියෙනවා හේතුව ඔබ ප්රකාශනය සම්පාදනය හැකි බව ය කිරීමට හෝ වඩාත් නිරවද්ය ලෙස ගැනීමට ක්රමයක් එය සකස් ට නැවත අගය ලෙස බව ක්රමය සඳහා නියෝජිතයා ලබා ගැනීමට - නියෝජිතයෙකු. නමුත් ප්‍රකාශන ගස යනු දත්ත පමණි. ඔබ Expression<Func<...>>සාධාරණ වෙනුවට භාවිතා කරන විට නියෝජිතයා නොපවතී Func<...>.
ලුවාන්

5
Yle කයිල් ඩෙලනි (isAnExample) => { if(isAnExample) ok(); else expandAnswer(); }එවැනි ප්‍රකාශනයක් ප්‍රකාශන ගසක් වන අතර, if -statement සඳහා ශාඛා නිර්මාණය වේ.
මැටියෝ මාෂියානෝ - එම්එස්සීපී

3
@bertl නියෝජිතයා යනු CPU දකින දෙයයි (එක් ගෘහ නිර්මාණ ශිල්පයක ක්‍රියාත්මක කළ හැකි කේතය), ප්‍රකාශනය යනු සම්පාදකයා දකින දෙයයි (හුදෙක් ප්‍රභව කේතයේ තවත් ආකෘතියක්, නමුත් තවමත් ප්‍රභව කේතය).
කේත වොරියර්

5
@bertl: එය වඩාත් නිවැරදිව සාරාංශගත කළ හැක්කේ ප්‍රකාශනයක් යනු විනෝදකාමී පුද්ගලයෙකුට නූල් සාදන්නෙකු යනු කුමක්ද යන්නයි. එය නූල් / ෆන්ක් නොවේ, නමුත් එසේ කිරීමට ඉල්ලා සිටින විට එය නිර්මාණය කිරීමට අවශ්‍ය දත්ත එහි අඩංගු වේ.
ෆ්ලැටර්

347

මම නොබොබ්ස් සඳහා පිළිතුරක් එක් කරන්නේ මෙම පිළිතුරු මගේ හිසට ඉහළින් පෙනෙන නිසා එය කෙතරම් සරලදැයි මට වැටහෙන තුරු ය. සමහර විට එය සංකීර්ණ බව ඔබේ අපේක්ෂාව වන අතර එමඟින් 'ඔබේ හිස වටා එතීමට' නොහැකි වේ.

LINQ-to-SQL සාමාන්‍යයෙන් භාවිතා කිරීමට උත්සාහ කරන ඇත්තෙන්ම කරදරකාරී 'දෝෂයකට' යන තෙක් මට වෙනස තේරුම් ගැනීමට අවශ්‍ය නොවීය:

public IEnumerable<T> Get(Func<T, bool> conditionLambda){
  using(var db = new DbContext()){
    return db.Set<T>.Where(conditionLambda);
  }
}

මම විශාල දත්ත කට්ටලවල OutofMemoryException ලබා ගැනීමට පටන් ගන්නා තෙක් මෙය විශිෂ්ටයි. ලැම්බඩා තුළ බ්‍රේක්පොයින්ට් සැකසීම මගේ මේසයේ සෑම පේළියක්ම එකින් එක මගේ ලැම්බඩා තත්වයට ගැලපෙන බව සොයමින් සිටින බව මට වැටහුණි. මෙය මා කලක සිට කම්පනයට පත් කළේය, මන්ද යත්, මගේ දත්ත වගුව දැවැන්ත IEnumerable ලෙස සලකන්නේ LINQ-to-SQL කිරීම වෙනුවට එය කළ යුත්තේ ඇයි? එය මගේ LINQ-to-MongoDb සහකරු තුළද එකම දේ කරමින් සිටියේය.

දෝෂ නිවැරදි හැරී හුදෙක් Func<T, bool>බවට Expression<Func<T, bool>>, ඒ නිසා එය අවශ්ය ඇයි මම googled Expressionවෙනුවට Funcමෙතන අවසන්.

ප්‍රකාශනයක් හුදෙක් නියෝජිතයෙකු තමා පිළිබඳ දත්ත බවට හරවයි. එබැවින් a => a + 1"වම් පැත්තේ එකක් ඇත int a. දකුණු පැත්තේ ඔබ එයට 1 ක් එක් කරයි." ඒක තමයි. ඔබට දැන් ගෙදර යා හැකිය. එය පැහැදිලිවම ඊට වඩා ව්‍යුහාත්මක ය, නමුත් එය අත්‍යවශ්‍යයෙන්ම ප්‍රකාශන ගසක් ඇත්තෙන්ම - ඔබේ හිස වටා එතීමට කිසිවක් නැත.

එය වටහා ගැනීමෙන්, LINQ-to-SQL ට අවශ්‍ය වන්නේ ඇයිද යන්න පැහැදිලි වන Expressionඅතර Funcඑය ප්‍රමාණවත් නොවේ. Funcඑය SQL / MongoDb / වෙනත් විමසුමකට පරිවර්තනය කරන්නේ කෙසේද යන්න පිළිබඳ විකාරරූපී බවක් දැකීමට එය තුළට ඇතුළු වීමට මාර්ගයක් ගෙන යන්නේ නැත. එය එකතු කිරීමක්ද, ගුණ කිරීමක්ද, අඩු කිරීමක්ද යන්න ඔබට නොපෙනේ. ඔබට කළ හැක්කේ එය ක්‍රියාත්මක කිරීමයි. Expression, අනෙක් අතට, නියෝජිතයා ඇතුළත බැලීමට සහ එය කිරීමට අවශ්‍ය සියල්ල බැලීමට ඔබට ඉඩ සලසයි. SQL විමසුමක් මෙන් ඔබට අවශ්‍ය ඕනෑම දෙයකට නියෝජිතයා පරිවර්තනය කිරීමට මෙය ඔබට බලය ලබා දෙයි. Funcමගේ DbContext ලැම්බඩා ප්‍රකාශනයේ අන්තර්ගතය අන්ධ බැවින් එය ක්‍රියාත්මක නොවීය. මේ නිසා, එයට ලැම්බඩා ප්‍රකාශනය SQL බවට හැරවීමට නොහැකි විය; කෙසේ වෙතත්, එය ඊළඟ හොඳම දේ කළ අතර මගේ වගුවේ එක් එක් පේළිය හරහා එම කොන්දේසිය නැවත ප්‍රකාශ කළේය.

සංස්කරණය කරන්න: ජෝන් පීටර්ගේ ඉල්ලීම පරිදි මගේ අවසාන වාක්‍යය පැහැදිලි කිරීම:

IQueryable IEnumerable දිගු කරයි, එබැවින් IEnumerable හි ක්‍රම Where()පිළිගන්නා අධික බර පැටවීම වැනි Expression. ඔබ ඒ සඳහා සමත් වූ Expressionවිට, ඔබ එහි ප්‍රති I ලයක් ලෙස IQueryable එකක් තබා ගනී, නමුත් ඔබ සමත් වූ විට Func, ඔබ IEnumerable පදනම මතට වැටෙන අතර එහි ප්‍රති I ලයක් ලෙස ඔබට IEnumerable ලැබෙනු ඇත. වෙනත් වචන වලින් කිවහොත්, ඔබ නොදැනුවත්වම ඔබේ දත්ත කට්ටලය විමසීමට යමක් වෙනුවට නැවත සැකසිය යුතු ලැයිස්තුවක් බවට පත් කර ඇත. ඔබ අත්සන් දෙස බැලූ විට වෙනසක් දැකීම දුෂ්කර ය.


2
චැඩ්; කරුණාකර මෙම ප්‍රකාශය තව ටිකක් පැහැදිලි කරන්න: "මගේ ඩීබීකොන්ටෙක්ස්ට් ලැම්බඩා ප්‍රකාශනයේ ඇත්ත වශයෙන්ම එය SQL බවට හැරවීමට අන්ධව සිටි නිසා එය ක්‍රියා කළේ නැත, එබැවින් එය ඊළඟ හොඳම දේ කළ අතර මගේ වගුවේ එක් එක් පේළිය හරහා එම කොන්දේසිය නැවත ප්‍රකාශ කළේය. . "
ජෝන් පීටර්ස්

2
>> Func ... ඔබට කළ හැක්කේ එය ක්‍රියාත්මක කිරීමයි. එය හරියටම සත්‍ය නොවේ, නමුත් අවධාරණය කළ යුතු කාරණය එයයි. කාර්යයන් / ක්‍රියා ධාවනය කළ යුතු අතර, ප්‍රකාශන විශ්ලේෂණය කළ යුතුය (ධාවනය කිරීමට පෙර හෝ ධාවනය වෙනුවට).
කොන්ස්ටන්ටින්

H චැඩ් මෙහි ඇති ගැටලුව එයද?: Db.Set <T> සියලු දත්ත සමුදා වගු විමසීය, පසුව. මන්ද, කොතැනද (conditionLambda) කොහේද (IEnumerable) දිගු කිරීමේ ක්‍රමය භාවිතා කළ අතර එය මතකයේ මුළු වගුවේම ගණනය කෙරේ. . මම හිතන්නේ ඔබට OutOfMemoryException ලැබෙනු ඇත, මන්ද මෙම කේතය මුළු වගුවම මතකයට පැටවීමට උත්සාහ කළ නිසාය (ඇත්ත වශයෙන්ම වස්තු නිර්මාණය විය). මම හරිද? ස්තූතියි :)
Bence Végert

107

එක්ස්ප්‍රස්ෂන් එදිරිව ෆන්ක් තෝරා ගැනීමේදී අතිශයින්ම වැදගත් කරුණක් නම්, ලින්ක් ටු එන්ටිටීස් වැනි IQuery කළ හැකි සැපයුම්කරුවන්ට ඔබ ප්‍රකාශනයකින් සම්මත කරන දේ 'ජීර්ණය' කළ හැකි නමුත් ඔබ විනෝදය තුළ සම්මත කරන දේ නොසලකා හරිනු ඇත. මෙම විෂය පිළිබඳ මට බ්ලොග් සටහන් දෙකක් තිබේ:

ප්‍රකාශන එදිරිව Func with Entity Framework සහ LINQ සමඟ ආදරයෙන් බැඳීම - 7 වන කොටස: ප්‍රකාශන සහ කාර්යයන් (අවසාන කොටස)


+ l පැහැදිලි කිරීම සඳහා. කෙසේ වෙතත් මට ලැබෙන්නේ 'LINQ ප්‍රකාශන නෝඩ් වර්ගය' ඉන්වොක් 'LINQ සිට ආයතන දක්වා සහය නොදක්වයි.' ප්‍රති .ල ලබා ගැනීමෙන් පසු ForEach භාවිතා කිරීමට සිදුවිය.
tymtam

81

ක්‍රයිස්ටොෆ් ක්වාලිනාගේ පොතෙන් ( රාමු සැලසුම් මාර්ගෝපදේශ: සම්මුතීන්, අයිඩියම් සහ නැවත භාවිතා කළ හැකි රටා .නෙට් පුස්තකාල ) වෙතින් ඒ පිළිබඳව වඩාත් දාර්ශනික පැහැදිලි කිරීමක් තිබේ ;

රිකෝ මරියානි

රූප නොවන අනුවාදය සඳහා සංස්කරණය කරන්න:

සිදුවිය යුතු සියල්ල යම් කේතයක් ධාවනය කිරීම නම් බොහෝ විට ඔබට Func හෝ Action අවශ්‍ය වනු ඇත. කේතය විශ්ලේෂණය කිරීමට, අනුක්‍රමික කිරීමට හෝ එය ක්‍රියාත්මක කිරීමට පෙර ප්‍රශස්තිකරණය කිරීමට අවශ්‍ය වූ විට ඔබට ප්‍රකාශනය අවශ්‍ය වේ. ප්‍රකාශනය යනු කේතය ගැන සිතීම සඳහා වන අතර, එය ක්‍රියාත්මක කිරීම සඳහා Func / Action වේ.


11
හොඳින් දාන්න. එනම්. ඔබේ Func යම් ආකාරයක විමසුමක් බවට පරිවර්තනය වනු ඇතැයි අපේක්ෂා කරන විට ඔබට ප්‍රකාශනය අවශ්‍ය වේ. එනම්. ඔබ database.data.Where(i => i.Id > 0)ලෙස ක්‍රියාත්මක කළ යුතුයි SELECT FROM [data] WHERE [id] > 0. ඔබ පමණක් Func සමත් නම්, ඔබ blinders ඔබේ රියදුරු දමා ඇති අතර එය කරන්න පුළුවන් සියළු SELECT *ඒ සියල්ල සිදු එක් එක් හා පෙරහන හරහා id> 0 ඔතන ඔබගේ සහ එය මතකය සියල්ල දත්ත පටවා වෙනවා වරක්, අවංකව Funcදී Expressionතේමා විශ්ලේෂණය කර Funcඑය SQL / MongoDb / වෙනත් විමසුමක් බවට පත් කිරීමේ ධාවක.
චැඩ් හෙඩ්කොක්

එබැවින් මම නිවාඩුවක් ගත කිරීමට සැලසුම් කරන විට, මම භාවිතා කරමි, Expressionනමුත් මම නිවාඩුවක් ගත කරන විට එය එසේ වනු ඇත Func/Action;)
ගෝල්ඩ් බිෂොප්

1
Ha චැඩ්හෙඩ්කොක් මට අවශ්‍ය අවසාන කොටස මෙයයි. ස්තූතියි. මම කාලයක් තිස්සේ මේ දෙස බලා සිටිමි, මෙහි ඔබගේ අදහස් දැක්වීම මගින් සියලුම අධ්‍යයන ක්ලික් කිරීම් සිදු විය.
ජොනී

80

Func<T>සහ අතර ඇති වෙනස්කම් ගැන සටහන් කිහිපයක් එක් කිරීමට මම කැමතියි Expression<Func<T>>:

  • Func<T> සාමාන්‍ය පැරණි පාසැල් බහුකාස්ට් ඩෙලිගේට් එකක් පමණි;
  • Expression<Func<T>> ප්‍රකාශන ගස ස්වරූපයෙන් ලැම්බඩා ප්‍රකාශනය නිරූපණය කිරීමකි;
  • ප්‍රකාශන ගස ලැම්බඩා ප්‍රකාශන සින්ටැක්ස් හරහා හෝ ඒපීඅයි සින්ටැක්ස් හරහා සෑදිය හැකිය;
  • ප්‍රකාශන ගස නියෝජිතයෙකුට සම්පාදනය කළ හැකිය Func<T>;
  • ප්‍රතිලෝම පරිවර්තනය න්‍යායාත්මකව කළ හැකි නමුත් එය එක්තරා ආකාරයක දිරාපත් වීමකි, එය සෘජු ක්‍රියාවලියක් නොවන බැවින් ඒ සඳහා කිසිදු ක්‍රියාකාරීත්වයක් නොමැත;
  • ප්‍රකාශන ගස නිරීක්ෂණය කළ හැකිය / පරිවර්තනය කළ හැකිය ExpressionVisitor;
  • IEnumerable සඳහා දිගු කිරීමේ ක්‍රම ක්‍රියාත්මක වන්නේ Func<T>;
  • IQueryable සඳහා වන ව්‍යාප්ති ක්‍රම ක්‍රියාත්මක වේ Expression<Func<T>>.

කේත සාම්පල සමඟ විස්තර විස්තර කරන ලිපියක් ඇත:
LINQ: Func <T> එදිරිව ප්‍රකාශනය <Func <T>> .

එය ප්‍රයෝජනවත් වේ යැයි සිතමි.


ලස්සන ලැයිස්තුවක්, එක් කුඩා සටහනක් නම්, ප්‍රතිලෝම පරිවර්තනය කළ හැකි බව ඔබ සඳහන් කළත්, කෙසේ වෙතත් නිශ්චිත ප්‍රතිලෝමයක් නොවේ. පරිවර්තන ක්‍රියාවලියේදී සමහර පාර-දත්ත නැති වී යයි. කෙසේ වෙතත් ඔබට එය නැවත සම්පාදනය කිරීමේදී එකම ප්‍රති result ලය ලබා දෙන ප්‍රකාශන ගසකට විසංයෝජනය කළ හැකිය.
අයිඩියාකාපි

38

ලින්ක් යනු කැනොනිකල් උදාහරණයයි (නිදසුනක් ලෙස, දත්ත සමුදායක් සමඟ කථා කිරීම), නමුත් ඇත්ත වශයෙන්ම, ඔබ ඇත්ත වශයෙන්ම එය කරනවාට වඩා කළ යුතු දේ ප්‍රකාශ කිරීමට වැඩි සැලකිල්ලක් දක්වයි. උදාහරණයක් ලෙස, මම මෙම ප්‍රවේශය ප්‍රොටොබුෆ්-නෙට් හි ආර්පීසී තොගයේ භාවිතා කරමි (කේත උත්පාදනය ආදිය වළක්වා ගැනීම සඳහා) - එබැවින් ඔබ මේ සමඟ ක්‍රමයක් අමතන්න:

string result = client.Invoke(svc => svc.SomeMethod(arg1, arg2, ...));

මෙය විසඳීම සඳහා ප්‍රකාශන ගස විසංයෝජනය කරයි SomeMethod(සහ එක් එක් තර්කයේ වටිනාකම), ආර්පීසී ඇමතුම සිදු කරයි, ඕනෑම ref/ outආර්ග් යාවත්කාලීන කරයි, සහ දුරස්ථ ඇමතුමෙන් ප්‍රති result ලය ලබා දෙයි. මෙය කළ හැක්කේ ප්‍රකාශන ගස හරහා පමණි. මම මෙය තවත් මෙහි ආවරණය කරමි .

තවත් උදාහරණයක් නම්, සාමාන්‍ය මෙහෙයුම්කරුවන්ගේ කේතය මඟින් සිදු කරන පරිදි, ලැම්බඩයකට සම්පාදනය කිරීමේ අරමුණින් ඔබ ප්‍රකාශන ගස් අතින් සාදන විට .


20

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


20

මූලික හේතුව වන්නේ ඔබට කේතය කෙලින්ම ක්‍රියාත්මක කිරීමට අවශ්‍ය නැති නමුත් එය පරීක්ෂා කිරීමට අවශ්‍ය වීමයි. මෙය හේතු ගණනාවක් නිසා විය හැකිය:

  • කේතය වෙනත් පරිසරයකට සිතියම් ගත කිරීම (එනම්, C # කේතය වස්තු රාමුවේ SQL වෙත)
  • ධාවන වේලාවේදී කේතයේ කොටස් ප්‍රතිස්ථාපනය කිරීම (ගතික ක්‍රමලේඛනය හෝ සරල DRY ශිල්පීය ක්‍රම)
  • කේත වලංගු කිරීම (ස්ක්‍රිප්ටින් අනුකරණය කිරීමේදී හෝ විශ්ලේෂණය කිරීමේදී ඉතා ප්‍රයෝජනවත් වේ)
  • අනුක්‍රමිකකරණය - ප්‍රකාශන පහසුවෙන් හා ආරක්ෂිතව අනුක්‍රමිකකරණය කළ හැකිය, නියෝජිතයින්ට නොහැකිය
  • සහජයෙන්ම තදින් ටයිප් නොකරන ලද දේවල දැඩි ලෙස ටයිප් කළ ආරක්ෂාව, සහ ඔබ ධාවන වේලාවේදී ගතික ඇමතුම් ලබා ගත්තද සම්පාදක චෙක්පත් ගසාකෑම (රේසර් සමඟ ASP.NET MVC 5 කදිම නිදසුනකි)

අංක 5
uowzd01

Raz uowzd01 රේසර් දෙස බලන්න - එය මෙම ප්‍රවේශය පුළුල් ලෙස භාවිතා කරයි.
ලුවාන්

ULuaan මම ප්‍රකාශන අනුක්‍රමිකකරණයන් සොයන නමුත් සීමිත තෙවන පාර්ශවීය භාවිතයකින් තොරව කිසිවක් සොයාගත නොහැක. .නෙට් 4.5 ආධාරක ප්‍රකාශන ගස් අනුක්‍රමිකකරණය කරන්නේද?
vabii

abvabii මා දන්නා දෙයක් නොවේ - එය සාමාන්‍ය නඩුවට හොඳ අදහසක් නොවනු ඇත. මගේ අදහස නම්, ඔබට සහාය දැක්වීමට අවශ්‍ය විශේෂිත අවස්ථා සඳහා, ඉතා කලින් සැලසුම් කර ඇති අතුරුමුහුණත් වලට එරෙහිව ඉතා සරල අනුක්‍රමිකතාවයක් ලිවීමට ඔබට හැකි වීමයි - මම එය කිහිප වතාවක්ම කර ඇත්තෙමි. පොදුවේ ගත් Expressionකල, ඕනෑම ප්‍රකාශනයකට අත්තනෝමතික නියෝජිතයෙකු / ක්‍රමවේද යොමු කිරීමක් ඉල්ලා සිටිය හැකි බැවින්, නියෝජිතයෙකු ලෙස අනුක්‍රමිකකරණය කළ නොහැකි ය. "පහසු" සාපේක්ෂයි.
ලුවාන්

15

කාර්ය සාධනය සඳහන් කරන කිසිදු පිළිතුරක් මා තවම දකින්නේ නැත. Func<>ඒ තුළට යාම Where()හෝ Count()නරක ය. ඇත්ත නරකයි. ඔබ භාවිතා කරන්නේ නම් Func<>එය ආමන්ත්රණය IEnumerableLINQ දේවල් වෙනුවට IQueryable, එයින් අදහස් මුළු වගු තුළ ඇද ගැනීමට බව පසුව පෙරීම. Expression<Func<>>සැලකිය යුතු වේගයකින්, විශේෂයෙන් ඔබ වෙනත් සේවාදායකයක ජීවත්වන දත්ත සමුදායක් විමසන්නේ නම්.


මෙය මතකයේ ඇති විමසුමටද අදාළ වේද?
stt106

@ stt106 බොහෝ විට නැත.
mhenry1384

මෙය සත්‍ය වන්නේ ඔබ ලැයිස්තුව ගණන් කළහොත් පමණි. ඔබ GetEnumerator හෝ foreach භාවිතා කරන්නේ නම්, ඔබ ගණන් කළ නොහැකි දේ සම්පූර්ණයෙන්ම මතකයට පටවන්නේ නැත.
nelsontruran


1

මෙහි ඕනෑවට වඩා සරල කර ඇත, නමුත් ෆන්ක් යනු යන්ත්‍රයක් වන අතර ප්‍රකාශනය සැලැස්මක් වේ. : ඩී

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.