Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

For loop with 20 items skip each time

I would like to write a piece of for loop which would go through an existing list and take 20 items out of that list each time it iterates.

So something like this:

  • If filteredList list contains let's say 68 items...
  • First 3 loops would take 20 times each and then in last 4th iteration it would take the rest of the 8 items that are residing in the list...

I have written something like this:

var allResponses= new List<string>();
for (int i = 0; i < filteredList.Count(); i++)
{
    allResponses.Add(GetResponse(filteredList.Take(20).ToList()));
}

Where assuming filteredList is a list that contains 68 items. I figured that this is not a way to go because I don't want to loop to the collections size, but instead of 68 times, it should be 4 times and that I take 20 items out of the list each time... How could I do this?

like image 650
User987 Avatar asked Feb 04 '23 16:02

User987


1 Answers

You are pretty close - just add a call to Skip, and divide Count by 20 with rounding up:

var allResponses= new List<string>();
for (int i = 0; i < (filteredList.Count+19) / 20; i++) {
    allResponses.Add(GetResponse(filteredList.Skip(i*20).Take(20).ToList()));
}

The "add 19, divide by 20" trick provides an idiomatic way of taking the "ceiling" of integer division, instead of the "floor".

Edit: Even better (Thanks to Thomas Ayoub)

var allResponses= new List<string>();
for (int i = 0 ; i < filteredList.Count ; i = i + 20) {
    allResponses.Add(GetResponse(filteredList.Skip(i).Take(20).ToList()));
}
like image 83
Sergey Kalinichenko Avatar answered Feb 08 '23 22:02

Sergey Kalinichenko