我有一個IEnumerable,我想要使用以下業務邏輯將數據分成3列。如果3個或更少的項目,每列1個項目,我希望將總項目除以3的任何其他項目在前兩列之間分割剩餘物(1或2個項目)。現在這是非常醜陋的,但它完成了這項工作。我正在尋找提示,以便更好地利用linq或可能消除switch語句。任何改善代碼的建議或提示都會被讚賞。C#算法重構將數組分成3部分?
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;
}
}
這個問題可能更適合http://codereview.stackexchange.com/ –
認爲遞歸!剩餘規則原則上與「小於3」的規則相同,後者又與分規則相似 – Polity