2015-06-07 10 views
7

Czy istnieje sposób na użycie pętli, która zajmuje pierwsze 100 pozycji na dużej liście, robi coś z nimi, następnie 100 itd., ale gdy zbliża się koniec, automatycznie skraca krok "100" do pozostałych elementów.Przetwarzaj listę z pętlą, pobierając po 100 elementów za każdym razem i automatycznie mniej niż 100 na końcu listy.

Obecnie muszę używać dwóch czy pętle:

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) 
    } 
} 

Czy istnieje lepszy sposób to zrobić? Jeśli nie, to przynajmniej sprawię, że "rzecz" będzie funkcją, więc kod nie musi być kopiowany dwa razy.

+0

możliwe duplikat [Lista podzielona na podlisty z LINQ] (http://stackoverflow.com/questions/419019/split-list-into-sublists-with-linq) - to zachowanie chunkifying jest dokładnie to, co jest zapytał, po prostu z LINQ nie tylko za pomocą zwykłych pętli i zmiennych. Więc może nie dokładny duplikat, ale wciąż warty rozważenia i warty przeczytania. – quetzalcoatl

Odpowiedz

18

Można skorzystać z LINQ Skip i Take i kodzie będzie czystsze.

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

Uwaga: Jeśli elementy są mniejsze niż 100 Take nie daje pozostałych.

+0

Dzięki, działa jak urok. Również bardzo jasne! Potrzebowałem ciągów elementów listy, które stały się: 'string.Join (", ", idList.Skip (i) .Take (100))' – SecondLemon

3

Można mieć wyraźny zmiennej dla punktu końcowego:

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 - poprawiono 0 do i, ale co masz na myśli przez manual i duplikowane? – user3476093

+0

głównie tylko trzy: "// rób to, co chcesz z przedmiotu" jest wymagane, aby napisać dwa razy (tak, mała rzecz, ale początkujący nie będą myśleć o metodzie i skopiuje i wkleja ciała), pętle główne i wykończeniowe są oddzielne (po co? nic nie wydaje się zdobyte.może zgnieść je w jedną z 'Math.min')," amount_of_hundreds; remain_number "może użyć div-mod zamiast obliczać" pozostałą "część ręcznie. Tylko kosmetyki. – quetzalcoatl

Powiązane problemy