以组的形式输出集合中的项目

时间:2015-04-09 14:58:53

标签: c# linq razor umbraco ienumerable

我正在考虑是否可以使用C#循环访问集合,但是将集合中的项目组织成组并以这种方式输出它们。

所以,我的收藏如下:

<ul class="list-unstyled">
   @foreach (IPublishedContent destination in destinations.Descendants("country").OrderBy(x => x.Name))
      {
         <li><a href="@destination.Url">@destination.Name</a></li>
      }
</ul>

这会输出集合中的许多项目作为链接。但是,如果我想将这些项目中的6个分组到他们自己的无序列表中,那么如果我的集合中有24个项目,而不是只有一个无序列表,那么我有4个?

我正在使用Razor,所以最初我想出了以下(有些破坏的逻辑),但由于未关闭的html标签,这将无法在Razor中验证。

int count = 0;  

@foreach (IPublishedContent destination in destinations.Descendants("country").OrderBy(x => x.Name))
   {
       if (count == 0){ <ul class="list-unstyled">}

       <li><a href="@destination.Url">@destination.Name</a></li>

       @count++

       if(count == 5){ 
          count = 0;
          </ul>
       }
   }

此外,这种逻辑从根本上是有缺陷的,因为它要求集合中存在完全可分割的项目数。此外,当收集结束时,您将在其他问题中没有结束标记。

有没有人对替代方法有任何建议?我确实认为可以使用一些lamda函数来实现这一点,但我对Linq还是比较新的,所以不太确定。

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:3)

您可以使用以下技术将它们分组:

var list = destinations.Descendants("country").OrderBy(x => x.Name);

var groups = list
    .Select((x, i) => new { Index = i, Destination = x })
    .GroupBy(x => x.Index / 6)
    .Select(x => x.Select(y => y.Destination));

然后使用两个嵌套的foreach循环来渲染它们,即

@foreach (var group in groups)
{
    <ul>
        @foreach (var destination in group)
        {
            <li><a href="@destination.Url">@destination.Name</a></li>
        }
     </ul>
 }

答案 1 :(得分:0)

这里有一些未经考验的代码,但你应该得到要点

int count = 0;  
<ul class="list-unstyled">
@foreach (IPublishedContent destination in destinations.Descendants("country").OrderBy(x => x.Name))
{

   <li><a href="@destination.Url">@destination.Name</a></li>

   @count++

   if(count % 6 == 0){ 
      </ul>
      <ul class="list-unstyled">
   }
}
</ul>

答案 2 :(得分:0)

skip()和take()方法可能就是你要找的东西。模型是字符串列表的示例。

@{ var count = Model.Count();
   var skip = 0;
   var take = 6;
}

@for(var i = 0; i <= count; i += take){
    <ul>
    @foreach (var item in Model.Skip(skip).Take(take))
    {
        <li>@item</li>
    }
   </ul>
  skip += take;
}

这将输出列表中的所有项目,最多为&#34; take&#34;是。另外

  

集合中完全可分割的项目数

问题不会成为问题,因为剩余的项目仍会输出到自己的无序列表中。