2012-03-15 44 views

回答

67
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 

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(); 
+3

+1相当肯定这是实际选择页面的唯一答案,剩下的只是选择项目11-20 ;-) – 2012-03-15 10:51:08

+2

如果bannersPhrases是一个'IQueryable',忽略了其余的评论。请不要在家里这样做! 'Enumerable.Skip'是O(n)! :-)(如果你不信任我,请尝试通过IlSpy/Reflector查看它)。我甚至会注意到你没有缓存横幅短语。我希望bannerPhrases是一个固定的集合,因为如果它太'IEnumerable',那么它将被重新生成每个页面。 – xanatos 2012-03-15 11:01:29

6

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

Phrases = bannersPhrases.Select(x=>x.Phrase).Skip(10).Take(10).ToArray() 
3

您可以使用Skip扩展方法

Phrases = bannersPhrases.Select(x=>x.Phrase).Skip(10).Take(10).ToArray() 
17

如果你正在做寻呼和你只是想跳转到特定页面,您可以使用SkipTake,如其他一些答案中所述。但是,如果您想将整个序列分组为特定大小的块,则可以使用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)); 

输出是:

 
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 
+0

你能解释一下你的linq查询是如何工作的吗?我一直认为你只能访问Select查询中的collection元素。在这里,您可以访问收藏元素和虚构的i,我不明白它来自哪里。 – 2014-09-11 11:02:45

+1

@ParthShah:这不是一个“虚构的我”。它是源序列中元素的索引。我正在使用的重载[记录在MSDN](http://msdn.microsoft.com/en-us/library/bb534869(v = vs.110).ASPX)。我将源序列投影到一个序列中,该序列包含我用来分组的序号。 – 2014-09-11 11:19:24

+1

对不起,它叫虚。哇,这是一个很酷的查询!你先生赢得了我的投票! – 2014-09-11 11:38:00