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

Use*_*987 3 c# for-loop list 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()));
}
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 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()));
}
Run Code Online (Sandbox Code Playgroud)

"加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()));
}
Run Code Online (Sandbox Code Playgroud)

  • @ User987你将跳过60,然后拿20,这将最终取8,完美,dasblinkenlight:对你的称赞 (2认同)
  • 只要`filteredList`不是每次迭代时将重新评估的序列(即列表或数组都没问题),这将正常工作.如果序列仅具有Skip()的线性访问机制,那么当然这将成为O(N ^ 2)解,而不是O(N)解.只是需要注意的事情. (2认同)