我可以简化代码吗?
我有很长的名单。我正在使用一些API,每次方法调用最多可接受25条记录。
我写了简单的分页
List<long> items = new List<long>(); // this will contain 100+ records
int itemsCnt = items.Count();
int pagesCnt = (itemsCnt + (itemsCnt % 25)) / 25; // calculating total pages
int page = 0;
while (page < pagesCnt)
{
List<long> itemsSinglePageList = items.GetRange(page, 25);
ProcessPageOfRecords(itemsSinglePageList);
page++;
}
我想知道我是否可以简化这一点。
答案 0 :(得分:2)
int pagesCnt = (itemsCnt + (itemsCnt % 25)) / 25; // calculating total pages
这不是你想要的。模数是余数,这意味着它用于减法,而不是加法。以下两个是正确的,但我更喜欢后者:
int pagesCnt = ((itemsCnt - (itemsCnt % 25)) / 25) + 1;
int pagesCnt = Math.Ceiling ( (double)itemsCnt / 25 ) ; //Rounding up is basically what you want here.
但是,对于深入审核,我建议将此帖子发布到https://codereview.stackexchange.com/,因为它们更适合这些类型的答案。
编辑要解释为什么模数使用在您的情况下是错误的:
假设有26个项目。让我们使用你的公式:
(itemsCnt + (itemsCnt % 25)) / 25
(26 + (26 % 25)) / 25
(26 + (1)) / 25
(27 ) / 25
//Not casted as double, so it's an int division
1
使用我的例子:
Math.Ceiling ( (double)itemsCnt / 25 )
Math.Ceiling ( (double)26 / 25 )
Math.Ceiling ( 1.04 )
2
答案 1 :(得分:1)
var numbers = Enumerable.Range(1,100);
var items_per_page =25;
var pages = numbers.Count ()/items_per_page;
for (int i = 0; i < pages; i++)
{
// Do something like
var some_var = numbers.Skip(i*items_per_page).Take(items_per_page);
// use that some_var in funky ways
}
应该这样做......
答案 2 :(得分:1)
你需要使用PageSize&amp;您做生意?
我发现使用Skip&amp; amp;更改为olny拿,然后依靠Linq为我做一切,更容易和更轻松少漏洞:
var toShow = items.Skip(skip).Take(pageSize);
答案 3 :(得分:0)
查看MoreLinq的批处理方法。
您可以快速创建源集合中的批次,如下所示:
var batches = Enumerable.Range(1,100000).Batch(25);
所以在重构之后你的逻辑将是这样的:
List<long> items = new List<long>(); // this will contain 100+ records
items.Batch(25).ForEach(batch => ProcessPageOfRecords(batch));
答案 4 :(得分:0)
可能不是最有效但在一个Linq中完成。
int pageSize = 25;
var pages = list.Select((item, i) => new { Page = i/pageSize, Item = item })
.GroupBy(g => g.Page)
.Select(d => new { Page = d.Key, Items = d.Select(i => i.Item).ToList() })
.ToList()