質問

いページを通じてコレクションLINQいて startIndexcount?

役に立ちましたか?

解決

数ヶ月後に書いたブログに紹堪能インタフェースとLINQを使用延長方法 IQueryable<T> 別のクラスは以下の事項を自然のpaginating、LINQます。

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

できるコードを取得しますからにMSDNコードギャラリーのページ: パイプラインフィルが堪能なAPIの商品.

他のヒント

とても簡単なの SkipTake 延長す。

var query = from i in ideas
            select i;

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

私は、このビットのようにしていったり、おみくじをひいたりなど自分のpaginator、リピーター.いずれの集ページの表示件数を増やす表示件数を減らアイテムの集い:

// 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
    }
}

この問いはやや古いが、しようと思ったのは私のページングアルゴリズムを示す全体手順を含むユーザー相互作用).

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-アルゴリズムは、上記のがperformant:

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+のままだすべての副10-30行われているもアルバイトを始める前に、繰り返し処理を行40+.の変異体を用い IEnumerableインターフェイスに直接、代わりに覚えの位置における最新の論理ページのような明示的な飛びが必要と副作用のない繰り返されないとも限らない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top