如何用for循环替换foreach循环

use*_*934 0 c# linq ienumerable for-loop asp.net-mvc-3

我正在寻找合适的语法.我正在使用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) %>
Run Code Online (Sandbox Code Playgroud)

sma*_*man 5

你的模型是类型的IEnumerable<MvcMysurvey.Models.Mysurvey>.

问题是IEnumerable<T>不暴露indexer([])运算符.您有两种方法可以解决这种不便.

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

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

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

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

     <% for (int i = 0; i < Model.Count(); i++) {%>
        <%: Html.HiddenFor(m => m.ElementAt(i).ID) %>
    
    Run Code Online (Sandbox Code Playgroud)

数组语法几乎肯定会更有效.