如何用for循环替换foreach循环

时间:2012-06-14 20:01:49

标签: c# asp.net-mvc-3 linq for-loop ienumerable

我正在寻找合适的语法。我正在使用MVC,在我看来,我需要遍历模型,因为我需要做一些不同的其他事情。我是一个新手,看了很多帖子,但没有找到语法。 这是代码,它起作用:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcMysurvey.Models.Mysurvey>>" %>
<% foreach (var item in Model) {%>
            <%: Html.HiddenFor(m => item.ID) %>

And here is the code I need the syntax for to make it working:

   <% for (int i = 0; i < Model.Count(); i++) {%>
             <%: Html.HiddenFor(m => m[i].ID) %>

2 个答案:

答案 0 :(得分:5)

您的模型属于IEnumerable<MvcMysurvey.Models.Mysurvey>类型。

问题是IEnumerable<T>不会公开indexer ([]) operator。您有两种方法可以解决这种不便。

  1. 改为使用数组或列表。
    数组和IList<T>实现确实公开了一个索引器操作符。要使用索引器语法,您需要将模型转换为数组或其他IList<T>。所以,只需改变你的

    <% for (int i = 0; i < Model.Count(); i++) {%>
       <%: Html.HiddenFor(m => m[i].ID) %>
    

    <% var items = Model.ToArray();
       for (int i = 0; i < items.Length; i++) {%>
          <%: Html.HiddenFor(m => items[i].ID) %>
    
  2. 使用the ElementAt method方法

    虽然IEnumerable<T>没有公开索引器操作符,但是有一个LINQ扩展方法可以执行相同的操作。它是the ElementAt method。要使用此语法,您可以将代码更改为:

     <% for (int i = 0; i < Model.Count(); i++) {%>
        <%: Html.HiddenFor(m => m.ElementAt(i).ID) %>
    
  3. 数组语法几乎肯定会更有效率。

答案 1 :(得分:0)

我想这可能是你在找什么?你的问题不太清楚,但听起来你正在寻找基于计数等于某事的条件做某事。如果是这种情况,你只需要添加一个if语句来检查你正在寻找的任何值的计数。

<% for (int i = 0; i < Model.Count(); i++)
<% { %>
    <% if (i == someCount) %>
    <% { %>
        <!-- Do Something Here -->
    <% } %>
    <%: Html.HiddenFor(m => m[i].ID) %>
<% } %>