2015-06-07 12 views
7

C'è un modo per usare un ciclo che prende i primi 100 elementi in una lista grande, fa qualcosa con loro, poi i successivi 100 ecc. ma quando si avvicina alla fine, accorcia automaticamente il passo "100" agli oggetti rimanenti.Elabora una lista con un ciclo, prendendo 100 elementi ogni volta e automaticamente meno di 100 alla fine della lista

Attualmente devo usare due se loop:

for (int i = 0; i < listLength; i = i + 100) 
{ 
    if (i + 100 < listLength) 
    { 
     //Does its thing with a bigList.GetRange(i, 100) 
    } 
    else 
    { 
     //Does the same thing with bigList.GetRange(i, listLength - i) 
    } 
} 

C'è un modo migliore di fare questo? Altrimenti farò almeno una "cosa" per far sì che il codice non debba essere copiato due volte.

+0

possibile duplicato di [Lista Spalato in sottoliste con LINQ] (http://stackoverflow.com/questions/419019/split-list-into-sublists-with-linq) - questo comportamento chunkifying è esattamente ciò che è chiesto, solo con LINQ non solo con semplici loop e variabili. Quindi, forse non è un duplicato esatto, ma vale comunque la pena considerarlo e degno di essere letto. – quetzalcoatl

risposta

18

È possibile fare uso di LINQ Skip e Take e il codice sarà più pulita.

for (int i = 0; i < listLength; i=i+100) 
{ 
    var items = bigList.Skip(i).Take(100); 
    // Do something with 100 or remaining items 
} 

Nota: Se le voci sono meno di 100 Take darebbe i rimanenti.

+0

Grazie, funziona come un fascino. Anche molto chiaro! Avevo bisogno di una stringa delle voci della lista così divenne: 'string.Join (", ", idList.Skip (i) .Take (100))' – SecondLemon

3

È possibile mantenere una variabile esplicita per il punto finale:

for (int i = 0, j; i < listLength; i = j) 
{ 
    j = Math.min(listLength, i + 100); 
    // do your thing with bigList.GetRange(i, j) 
} 
1
List<int> list = null; 
int amount_of_hundreds = Math.Floor(list.Count/100); 
int remaining_number = list.Count - (amount_of_hundreds * 100); 

for(int i = 0; i < amount_of_hundreds; ++i) 
    { 
    for(int j = 0; j < 100; ++j) 
     { 
     int item = list[(i * 100) + j]; 
     // do what you want with item 
     } 
    } 

for(int i = 0; i < remaining_number; ++i) 
    { 
    int item = list[(amount_of_hundreds * 100) + i]; 
    // do what you want with item 
    } 
+0

@quetzalcoatl - modificato da 0 a i, ma cosa intendi con manuale e duplicato? – user3476093

+0

principalmente solo i tre: "// fai quello che vuoi con l'articolo" è necessario che venga scritto due volte (sì, piccola cosa, ma i principianti non penseranno a un metodo e copieranno i corpi copia-incolla), i cicli principale e di finitura sono separati (per quale motivo non sembra essere ottenuto nulla, potrebbe comprenderli in uno con 'Math.min')," amount_of_cundreds, remaining_number "potrebbe usare div-mod invece di calcolare manualmente la parte 'rimanente'. Solo cosmetici – quetzalcoatl

Problemi correlati