startIndex
とがある場合、LINQ でコレクションをどのようにページングしますcount
か?
4 に答える
Skip
およびTake
拡張メソッドを使用すると、非常に簡単です。
var query = from i in ideas
select i;
var paggedCollection = query.Skip(startIndex).Take(count);
数か月前、私は 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から取得できます。
リピーターを使って自分でパジネーターを作らなければならなかったので、他の人が持っているものとは少し違った方法でこれを解決しました。それで、私は最初に私が持っているアイテムのコレクションのためにページ番号のコレクションを作りました:
// 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>
)。これは、上で作成したインデックスからインデックスを選択することSkip
とTake
一緒にそれを行う方法です。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
}
}