我想编写一段for循环,它将遍历现有列表,并在每次迭代时从该列表中取出20个项目。
这样的事情:
我写过这样的话:
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项。我怎么能这样做?
答案 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
添加0
,20
,40
...迭代而不使用 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]);
}