Ho un oggetto IEnumerable e volevo suddividere i dati su 3 colonne utilizzando la seguente logica aziendale. se 3 o meno elementi, 1 oggetto per colonna, qualsiasi altra cosa ho voluto dividere gli elementi totali per 3 dividere gli avanzi (1 o 2 elementi) tra le prime due colonne. Ora questo è abbastanza brutto, ma fa il lavoro. Sto cercando suggerimenti per sfruttare meglio linq o forse eliminare l'istruzione switch. Sono graditi consigli o suggerimenti che migliorano il codice.Rifrattore algoritmo C# che suddivide un array in 3 parti?
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);
definitiva Sto usando questi in vista Razor MVC
<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>
Nel mio primo tentativo voglio sbarazzarsi dei colNItems e variabili colNTake ma io non riesco a capire il corretto algoritmo per fallo funzionare allo stesso modo.
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;
}
}
Questa domanda è probabilmente una soluzione migliore per http://codereview.stackexchange.com/ –
Pensa ricorsiva! la regola del rimanente è in linea di principio uguale alla regola "minore di 3" che a sua volta è simile alla regola di divisione – Polity