用LINQ分頁收集



1 Answers

SkipTake擴展方法非常簡單。

var query = from i in ideas
            select i;

var paggedCollection = query.Skip(startIndex).Take(count);
Question

如果你有一個startIndex和一個count ,你如何通過LINQ中的一個集合進行分頁?




這個問題有點舊,但我想發布我的分頁算法,它顯示了整個過程(包括用戶交互)。

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算法一樣簡單,但性能更高:

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接口的變體將記住最後一個邏輯頁面結束的位置,因此不需要顯式跳過,副作用也不會重複。




Related