2014-05-06 4 views
5

मैं एक संग्रह के माध्यम से पाश के लिए एक IEnumerable विस्तार का उपयोग कर रहा है और यह भी अपने सूचकांक मिलती है:उपयोग foreach विस्तार

@Model.ForEach((card, i) => { 
    @<li class="[email protected](i)">@card.Text</li>; 
}) 

foreach विस्तार निम्नलिखित है:

public static void ForEach<T>(this IEnumerable<T> source, Action<T, Int32> action) { 

    Int32 i = 0; 
    foreach (T item in source) { 
    action(item, i); 
    i++; 
    } 

} // ForEach 

लेकिन जब मैं कोशिश इसे संकलित करने के लिए मुझे निम्न त्रुटि संदेश मिलता है:

तर्क 1: 'शून्य' से 'System.Web में परिवर्तित नहीं किया जा सकता है। WebPages.HelperResult '

मैं इस का समाधान कर सकते हैं? क्या मुझे एक नया एक्सटेंशन चाहिए?

+2

दिलचस्प समस्या - आसानी से बस द्वारा हल पाठ्यक्रम की विस्तार विधि के बजाय दृश्य में '@for (...)' का उपयोग कर। – James

+0

एक और मुद्दा यह है कि आपके foreach खंड का शरीर एक कार्य प्रतिनिधि को अनुवाद नहीं करता है। आप कोड से एचटीएमएल में एक रेजर संक्रमण को इंगित करने की कोशिश कर रहे हैं जिसे समझ में नहीं आता है। –

उत्तर

5

आपकी समस्या यह है कि रेजर जैसे मान को वापस करने के लिए आपकी ForEach विधि की अपेक्षा करता है।

इसके अलावा, आप बस अपने कार्य प्रतिनिधि के साथ काम करने के लिए रेजर को अपने foreach खंड के शरीर का अनुवाद करने की उम्मीद नहीं कर सकते हैं। इसे काम करने के लिए एक तरीका है, लेकिन यह उतना सुंदर नहीं है। मैं @for(...) खंड का उपयोग करने का सुझाव दूंगा क्योंकि जेम्स ने सुझाव दिया है कि क्या आप मानक रेजर सिंटैक्स का उपयोग करना चाहते हैं।

हालांकि, यहां एक कार्यान्वयन है कि करता है काम:

public static MvcHtmlString ForEach<T>(this IEnumerable<T> source, Func<T, Int32, string> selector) 
{ 
    return new MvcHtmlString(String.Join("\n", source.Select(selector))); 
} 

उपयोग:

@Model.ForEach((card, i) => 
{ 
    return "<li class=c" + i + ">" + card.Text + "</li>"; 
}) 
+0

संकल्पनात्मक रूप से यह 'कुल' का प्रतिनिधित्व कर रहा है, न कि 'ForEach', क्योंकि आप अनुक्रम में प्रत्येक आइटम को किसी अन्य रूप में बदल रहे हैं, और फिर परिणामस्वरूप उन सभी चीजों को संयोजित कर रहे हैं। आप इसे वास्तव में उन परिचालनों के साथ कार्यान्वित कर सकते हैं जो स्पष्ट करते हैं, न कि आपका गलत है, कुछ और करने के द्वारा, 'नया MvcHtmlString (string.Join ("\ n", स्रोत। चयन (क्रिया))); '। इसके अतिरिक्त, 'एक्शन' वास्तव में अब कोई कार्रवाई नहीं है, क्योंकि यह एक मूल्य उत्पन्न करता है। यह अब 'चयनकर्ता' है; मैं इसका नाम बदलने का सुझाव दूंगा। – Servy

+0

@ सर्वी हां, जो इसे काफी परेशान करता है। मैं इसे अपडेट करूंगा। मैं विधि के नाम को ओप तक छोड़ दूंगा और जैसा छोड़ सकता हूं। –

2

यह काम करता है, लेकिन यह hackish लगता है:

public static HelperResult ForEach<T>(this IEnumerable<T> source, Func<T, int, Func<TextWriter, HelperResult>> action) { 
    return new HelperResult((writer) => { 
    int i = 0; 
    foreach (T item in source) { 
     action(item, i)(writer).WriteTo(writer); 
     i++; 
    } 
    }); 
} 

@Model.ForEach((card, i) => 
    @<li class="[email protected](i)">@card.Text</li> 
)