我有一个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