将集合拆分为不同大小的组

时间:2017-01-05 11:33:24

标签: c# linq

我有一个集合“个案”(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>

如何在第一个示例中获得输出的任何建议?

1 个答案:

答案 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))