对于循环,每次跳过20个项目

时间:2017-04-10 12:49:48

标签: c# list for-loop c#-4.0

我想编写一段for循环,它将遍历现有列表,并在每次迭代时从该列表中取出20个项目。

这样的事情:

  • 如果过滤列表包含让我们说68项......
  • 前3个循环每个需要20次,然后在最后的第4次迭代中,它将占用列表中剩余的8个项目......

我写过这样的话:

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

假设filteredList是包含68个项目的列表。我认为这不是一种可行的方法,因为我不想循环到集合大小,但不是68次,它应该是4次,每次我从列表中取出20项。我怎么能这样做?

3 个答案:

答案 0 :(得分:5)

您非常接近 - 只需添加对Skip的通话,然后将Count除以20并进行四舍五入:

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

“加19,除以20”技巧提供了一种惯用的方法来取整数除法的“上限”,而不是“地板”。

修改:更好(感谢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()));
}

答案 1 :(得分:2)

您只需计算页数:

const in PAGE_SIZE = 20;
int pages = filteredList.Count() / PAGE_SIZE
            + (filteredList.Count() % PAGE_SIZE > 0 ? 1 : 0)
            ;

最后一部分确保使用21,将在先前计算的页面大小上方添加1页(自21/20 = 1)。

或者,当使用MoreLINQ时,您只需使用Batch来电。

答案 2 :(得分:0)

我建议使用page添加02040 ...迭代而不使用 Linq 和复杂的模块化操作的简单循环:

int pageSize = 20;

List<String> page = null;

for (int i = 0; i < filteredList.Count; ++i) {
  // if page reach pageSize, add a new one 
  if (i % pageSize == 0) {
    page = new List<String>(pageSize);   

    allResponses.Add(page); 
  }

  page.Add(filteredList[i]); 
}