2017-01-05 16 views
1

私はそれぞれ第二行は2つの列が含まれている次のようなチャンクに分割したいコレクション「ケース」(IEnumerable<IPublishedContent>)を有します拡張メソッドを使用して異なるアプローチを見て、例えば.Chunk(2),.Batch(2)または.Split(2)であるが、ほとんどの場合、固定サイズに分割されている。 [1,2]、[3,4]、[5,6]、[7]今のところ分割収集

Iは、以下た:

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

いいえ、コレクションも2つのグループに分割されています - 最初は4、もう1つは3です。したがって、出力は2行になります。第2列の3列。 –

+0

次に、2で割ってみたいと思います。p =>(int)(pi/2) – jdweng

答えて

2

は、私はあなたがペアにトリプルを分割するために、その後のトリプルへの入力を分割する第1の複合キーで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

ありがとう、それは完璧に動作します!ちょうど私が必要なもの。 –