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

C#中的分页-我可以简化代码吗?,c#,pagination,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

我可以简化代码吗?

我有一张长长的清单。我使用一些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++;
}
List items=new List();//这将包含100多条记录
int itemsCnt=items.Count();
int pagesCnt=(itemsCnt+(itemsCnt%25))/25;//计算总页数
int page=0;
同时(第页<第页)
{
List itemsSinglePageList=items.GetRange(第25页);
ProcessPageOfRecords(itemsSinglePageList);
page++;
}
我想知道我是否可以简化一下

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.
然而,对于深入的审查,我建议将此发布到,因为它们更适合这些类型的答案

编辑以解释在您的情况下模数使用错误的原因:

假设有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
这不是你想要的。模数是余数,这意味着它用于减法,而不是加法。以下两个是正确的,但我更喜欢后者:

int pagesCnt = ((itemsCnt - (itemsCnt % 25)) / 25) + 1; 

int pagesCnt = Math.Ceiling ( (double)itemsCnt / 25 ) ; //Rounding up is basically what you want here.
然而,对于深入的审查,我建议将此发布到,因为它们更适合这些类型的答案

编辑以解释在您的情况下模数使用错误的原因:

假设有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
var编号=可枚举范围(1100);
每页风险值项目=25;
var pages=numbers.Count()/items\u每页;
对于(int i=0;i
这应该可以做到…

var numbers=Enumerable.Range(1100);
每页风险值项目=25;
var pages=numbers.Count()/items\u每页;
对于(int i=0;i
这样就可以了…

看看我们的批处理方法

您可以像这样从源集合中快速创建批:

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));
因此,重构后的逻辑如下所示:

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));
List items=new List();//这将包含100多条记录
items.Batch(25).ForEach(Batch=>ProcessPageOfRecords(Batch));
查看的批处理方法

您可以像这样从源集合中快速创建批:

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));
因此,重构后的逻辑如下所示:

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));
List items=new List();//这将包含100多条记录
items.Batch(25).ForEach(Batch=>ProcessPageOfRecords(Batch));
您需要使用PageSize和PageNo吗

我发现使用Skip&Take切换到olny,然后依靠Linq为我做所有事情,这要容易得多,也不容易出现bug:

var toShow = items.Skip(skip).Take(pageSize);
您需要使用PageSize和PageNo吗

我发现使用Skip&Take切换到olny,然后依靠Linq为我做所有事情,这要容易得多,也不容易出现bug:

var toShow = items.Skip(skip).Take(pageSize);

可能不是最有效的,但在一个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()

可能不是最有效的,但在一个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()

这个问题似乎离题了,因为它属于我,我觉得stackoverflow走错了方向。我想知道什么时候像“questions\u about\u for\u loops\u in_cpp.stackexchange.com”或“questions\u about\u tables\u in_html.stackexchange.com”这样的网站开始出现。这个问题似乎脱离主题,因为它属于我觉得stackoverflow走错了方向。我想知道什么时候像“questions\u about\u for\u loops\u in_cpp.stackexchange.com”或“questions\u about\u tables\u in_html.stackexchange.com”这样的网站开始出现了。我想到了这一点,但这应该是性能不佳的,不是吗。这应该有利于阅读和理解,对于100个对象来说,它的性能胜过它。。。如果您担心性能,您可以将
添加到数组
,只使用索引…我想到了这一点,但这应该是性能不佳,不是吗。这应该有利于阅读和理解,对于100个对象来说,这一点胜过性能。。。如果您担心性能,您可以将
添加到阵列
,只需使用索引…我把这个模数搞砸了。。。感谢您捕捉到这一点,以及Math.天花()方法的提示。这确实是我想要的。没问题,在这些类型的计算中很容易出错:)出于某种原因,模数是一个未充分使用的运算,因为我看到多次出现错误用法,或者在循环int值的情况下,只需选择
if(myCounter==cyclusSize)myCounter=0而不是
myCounter=++myCounter%cyclusSize。我觉得奇怪的是,人们并不默认在循环运算中使用模,但也许我的数学背景使我比其他开发人员更频繁地使用它。我同意这样的计算很容易出错。最好的解决办法是避免它们。。。请检查我下面关于在不进行此类计算的情况下生成批处理的回答。@st4hoo:这并非纯粹针对您,也无意冒犯您,但我发现开发人员现在都接受“永远不应该使用困难的东西!”这一观点是非常错误的。诚然,当使用只需要几个字符的操作时,创建模糊代码是相当容易的,因为人们试图在一行中容纳太多字符。问题是人们在一条线上的代码太多,而不是任何人都难以正确地使用它。”阿谀奉承者:我并没有说“困难的事情不应该被使用,永远!”我说过你应该避免使用容易出错的技术。这种方法可以降低出错的风险。另一点是:当你只想使用它的时候,为什么要重新发明轮子?我把这个模数搞砸了。。。感谢您捕捉到这一点,以及Math.天花()方法的提示。这个我