C#中的分页 - 我可以简化代码吗?

时间:2014-05-19 09:21:31

标签: c# pagination

我可以简化代码吗?

我有很长的名单。我正在使用一些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++;
}

我想知道我是否可以简化这一点。

5 个答案:

答案 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()