90

startIndexとがある場合、LINQ でコレクションをどのようにページングしますcountか?

4

4 に答える 4

65

SkipおよびTake拡張メソッドを使用すると、非常に簡単です。

var query = from i in ideas
            select i;

var paggedCollection = query.Skip(startIndex).Take(count);
于 2008-08-01T13:22:04.483 に答える
46

数か月前、私は Fluent Interfaces と LINQ に関するブログ記事を書きました。これは、拡張メソッドIQueryable<T>と別のクラスを使用して、LINQ コレクションをページ分割する次の自然な方法を提供します。

var query = from i in ideas
            select i;
var pagedCollection = query.InPagesOf(10);
var pageOfIdeas = pagedCollection.Page(2);

コードは、MSDN コード ギャラリー ページ: Pipelines, Filters, Fluent API and LINQ to SQLから取得できます。

于 2008-08-07T08:22:27.440 に答える
15

リピーターを使って自分でパジネーターを作らなければならなかったので、他の人が持っているものとは少し違った方法でこれを解決しました。それで、私は最初に私が持っているアイテムのコレクションのためにページ番号のコレクションを作りました:

// assumes that the item collection is "myItems"

int pageCount = (myItems.Count + PageSize - 1) / PageSize;

IEnumerable<int> pageRange = Enumerable.Range(1, pageCount);
   // pageRange contains [1, 2, ... , pageCount]

これを使用して、アイテムコレクションを「ページ」のコレクションに簡単に分割できます。この場合のページは、単なるアイテムのコレクションです(IEnumerable<Item>)。これは、上で作成したインデックスからインデックスを選択することSkipTake一緒にそれを行う方法です。pageRange

IEnumerable<IEnumerable<Item>> pageRange
    .Select((page, index) => 
        myItems
            .Skip(index*PageSize)
            .Take(PageSize));

もちろん、各ページを追加のコレクションとして処理する必要がありますが、たとえば、リピーターをネストしている場合、これは実際には簡単に処理できます。


ワンライナーTLDRバージョンは次のようになります。

var pages = Enumerable
    .Range(0, pageCount)
    .Select((index) => myItems.Skip(index*PageSize).Take(PageSize));

これは次のように使用できます。

for (Enumerable<Item> page : pages) 
{
    // handle page

    for (Item item : page) 
    {
        // handle item in page
    }
}
于 2012-03-20T12:52:15.480 に答える