2017-01-05 3 views
1

У меня есть коллекция «случаи» (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

Почему вы делите? Вам просто нужно p.1% 2. – jdweng

+0

Нет, это тоже пробовало, что разделило коллекцию на две группы - сначала с 4, а с второй - с 3. Таким образом, вывод выдал две строки, из которых 4 столбца в первой строке и 3 столбца во второй строке. –

+0

Затем вы хотите разделить на 2: p => (int) (pi/2) – jdweng

ответ

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)) 
+0

Спасибо, он работает отлично! Только то, что мне было нужно. –

Смежные вопросы