我有一个集合“个案”(IEnumerable<IPublishedContent>
),我想将其拆分为如下所示的块,其中每个第二行包含两列:
<div class="row">
<div class="col">1</div>
</div>
<div class="row">
<div class="col">2</div>
<div class="col">3</div>
</div>
<div class="row">
<div class="col">4</div>
</div>
<div class="row">
<div class="col">5</div>
<div class="col">6</div>
</div>
我见过使用扩展方法的不同方法,例如.Chunk(2)
,.Batch(2)
或.Split(2)
,但主要是将其拆分为固定大小,例如[1,2],[3,4],[5,6],[7]
现在我有以下内容:
var batches = w
.Select((x, i) => new { x, i })
.GroupBy(p => (p.i / (p.i % 2 == 0 ? 2 : 1)), p => p.x);
var rows = batches;
var count = 0;
foreach (var row in rows)
{
<div class="row">
@foreach (var c in row)
{
<div class="col">@(count+1)</div>
count++;
}
</div>
}
当集合包含7个元素时,输出为:
<div class="row">
<div class="col">1</div>
</div>
<div class="row">
<div class="col">2</div>
<div class="col">3</div>
</div>
<div class="row">
<div class="col">4</div>
<div class="col">5</div>
</div>
<div class="row">
<div class="col">6</div>
</div>
<div class="row">
<div class="col">7</div>
</div>
如何在第一个示例中获得输出的任何建议?
答案 0 :(得分:2)
我相信您可以首先使用复合键GroupBy
将输入拆分为三元组,然后将三元组拆分为一对:
var batches = w.Select((x, i) => new { x, i })
.GroupBy(e => new { K1 = e.i / 3, K2 = e.i % 3 == 0 ? 0 : 1 })
.Select(g => g.Select(e => e.x).ToArray())
.ToList();
另一种方法是使用相同的想法生成单个分组键:
.GroupBy(e => 2 * (e.i / 3) + (e.i % 3 == 0 ? 0 : 1))