IEnumerable があり、次のビジネス ロジックを使用してデータを 3 つの列に分割したいと考えていました。アイテムが 3 つ以下の場合、列ごとに 1 つのアイテム、それ以外の場合は、アイテムの合計を 3 で割りたい場合は、残りのアイテム (1 つまたは 2 つのアイテム) を最初の 2 つの列の間で分割します。これはかなり醜いですが、仕事はします。linq をもう少し有効に活用したり、場合によっては switch ステートメントを削除したりするためのヒントを探しています。コードを改善するためのアドバイスやヒントをいただければ幸いです。
var numItems = items.Count;
IEnumerable<JToken> col1Items,
col2Items,
col3Items;
if(numItems <=3)
{
col1Items = items.Take(1);
col2Items = items.Skip(1).Take(1);
col3Items = items.Skip(2).Take(1);
} else {
int remainder = numItems % 3,
take = numItems / 3,
col1Take,
col2Take,
col3Take;
switch(remainder)
{
case 1:
col1Take = take + 1;
col2Take = take;
col3Take = take;
break;
case 2:
col1Take = take + 1;
col2Take = take + 1;
col3Take = take;
break;
default:
col1Take = take;
col2Take = take;
col3Take = take;
break;
}
col1Items = items.Take(col1Take);
col2Items = items.Skip(col1Take).Take(col2Take);
col3Items = items.Skip(col1Take + col2Take).Take(col3Take);
最終的に、私はこれらをmvc Razorビューで使用しています
<div class="widgetColumn">
@Html.DisplayFor(m => col1Items, "MenuColumn")
</div>
<div class="widgetColumn">
@Html.DisplayFor(m => col2Items, "MenuColumn")
</div>
<div class="widgetColumn">
@Html.DisplayFor(m => col3Items, "MenuColumn")
</div>
私の最初の試みでは、colNItems 変数と colNTake 変数を取り除きたいのですが、同じように機能させるための正しいアルゴリズムがわかりません。
for (int i = 1; i <= 3; i++ )
{
IEnumerable<JToken> widgets = new List<JToken>();
var col = i;
switch(col)
{
case 1:
break;
case 2:
break;
case 3:
break;
}
}