首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用LINQ分页集合

使用LINQ分页集合
EN

Stack Overflow用户
提问于 2008-08-01 13:20:47
回答 3查看 5.8K关注 0票数 90

在给定startIndexcount的情况下,如何在LINQ中对集合进行分页

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-08-07 08:22:27

几个月前,我写了一篇关于Fluent Interfaces和LINQ的博客文章,它使用了IQueryable<T>上的一个扩展方法和另一个类,提供了以下对LINQ集合进行分页的自然方式。

代码语言:javascript
复制
var query = from i in ideas
            select i;
var pagedCollection = query.InPagesOf(10);
var pageOfIdeas = pagedCollection.Page(2);

您可以从MSDN code Gallery Page:Pipelines, Filters, Fluent API and LINQ to SQL获取代码。

票数 46
EN

Stack Overflow用户

发布于 2008-08-01 13:22:04

使用SkipTake扩展方法非常简单。

代码语言:javascript
复制
var query = from i in ideas
            select i;

var paggedCollection = query.Skip(startIndex).Take(count);
票数 65
EN

Stack Overflow用户

发布于 2011-07-17 04:07:57

这个问题有点老了,但我想发布我的分页算法,它显示了整个过程(包括用户交互)。

代码语言:javascript
复制
const int pageSize = 10;
const int count = 100;
const int startIndex = 20;

int took = 0;
bool getNextPage;
var page = ideas.Skip(startIndex);

do
{
    Console.WriteLine("Page {0}:", (took / pageSize) + 1);
    foreach (var idea in page.Take(pageSize))
    {
        Console.WriteLine(idea);
    }

    took += pageSize;
    if (took < count)
    {
        Console.WriteLine("Next page (y/n)?");
        char answer = Console.ReadLine().FirstOrDefault();
        getNextPage = default(char) != answer && 'y' == char.ToLowerInvariant(answer);

        if (getNextPage)
        {
            page = page.Skip(pageSize);
        }
    }
}
while (getNextPage && took < count);

但是,如果您追求的是性能,而在生产代码中,我们都追求的是性能,那么您不应该使用上面所示的LINQ分页,而应该使用底层的IEnumerator来实现分页。事实上,它与上面显示的LINQ算法一样简单,但性能更好:

代码语言:javascript
复制
const int pageSize = 10;
const int count = 100;
const int startIndex = 20;

int took = 0;
bool getNextPage = true;
using (var page = ideas.Skip(startIndex).GetEnumerator())
{
    do 
    {
        Console.WriteLine("Page {0}:", (took / pageSize) + 1);

        int currentPageItemNo = 0;
        while (currentPageItemNo++ < pageSize && page.MoveNext())
        {
            var idea = page.Current;
            Console.WriteLine(idea);
        }

        took += pageSize;
        if (took < count)
        {
            Console.WriteLine("Next page (y/n)?");
            char answer = Console.ReadLine().FirstOrDefault();
            getNextPage = default(char) != answer && 'y' == char.ToLowerInvariant(answer);
        }
    }
    while (getNextPage && took < count);
}

说明:以“级联方式”多次使用Skip()的缺点是,它不会真正存储迭代的“指针”,它最后一次被跳过的地方。-相反,原始序列将通过跳过调用进行前端加载,这将导致一次又一次地“消费”已经“消费”的页面。+您可以自己证明这一点,当您创建序列ideas以使其产生副作用时。->即使您跳过了10-20和20-30并希望处理40+,在开始迭代40+之前,您也会看到再次执行10-30的所有副作用。直接使用IEnumerable接口的变体将会记住最后一个逻辑页的末尾位置,因此不需要显式跳过,副作用也不会重复。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档