选择前10个记录,接着是10个,使用Linq进行分页

den*_*den 36 c# linq

如何选择前10个记录,然后是下10个,然后是下10个,只要数组不会结束.

Phrases = bannersPhrases.Select(x=>x.Phrase).Take(10).ToArray()
Run Code Online (Sandbox Code Playgroud)

如何获得接下来的10条记录?

Hac*_*ese 89

var total = bannersPhrases.Select(p => p.Phrase).Count();
var pageSize = 10; // set your page size, which is number of records per page

var page = 1; // set current page number, must be >= 1 (ideally this value will be passed to this logic/function from outside)

var skip = pageSize * (page-1);

var canPage = skip < total;

if (!canPage) // do what you wish if you can page no further
   return;

Phrases = bannersPhrases.Select(p => p.Phrase)
             .Skip(skip)
             .Take(pageSize)
             .ToArray();
Run Code Online (Sandbox Code Playgroud)

  • +1相当肯定这是实际选择页面的唯一答案,其余只选择项目11-20 ;-) (3认同)
  • 如果bannersPhrases是`IQueryable`,则忽略评论的其余部分.请不要在家里这样做!`Enumerable.Skip`是O(n)!:-)(如果你不相信我,试着通过IlSpy/Reflector查看它).我甚至会注意到你没有缓存bannerPhrases.我希望bannersPhrases是一个固定的集合,因为如果它太"IEnumerable"那么它将为每一页重新生成. (2认同)

Mar*_*age 20

如果您正在进行分页,并且您只想跳到可以使用的特定页面,Skip并且Take如其他一些答案中所述.但是,如果您希望将整个序列分组为特定大小的块,则可以使用GroupBy.这是一个小例子:

var groupSize = 4;
// The characters 'a' - 'z'.
var source = Enumerable.Range(0, 26).Select(i => (Char) ('a' + i));
var groups = source
  .Select((x, i) => new { Item = x, Index = i })
  .GroupBy(x => x.Index/groupSize, x => x.Item);
foreach (var group in groups)
  Console.WriteLine("{0}: {1}", group.Key, String.Join(", ", group));
Run Code Online (Sandbox Code Playgroud)

输出是:

0: a, b, c, d
1: e, f, g, h
2: i, j, k, l
3: m, n, o, p
4: q, r, s, t
5: u, v, w, x
6: y, z


Tsa*_*abo 6

你可以使用.Skip().这将返回接下来的10个项目:

 Phrases = bannersPhrases.Select(x=>x.Phrase).Skip(10).Take(10).ToArray()
Run Code Online (Sandbox Code Playgroud)


ole*_*sii 5

您可以使用跳过扩展方法

Phrases = bannersPhrases.Select(x=>x.Phrase).Skip(10).Take(10).ToArray()
Run Code Online (Sandbox Code Playgroud)