2012-03-15 11 views

risposta

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 Abbastanza certo questa è l'unica risposta che seleziona effettivamente pagine, il resto solo selezionare elementi 11-20 ;-) –

+2

Se bannersPhrases è un 'IQueryable' ignora il resto del commento. Per favore non farlo a casa! 'Enumerable.Skip' è O (n)! :-) (se non ti fidi di me, prova a guardarlo attraverso IlSpy/Reflector). Prenderò anche nota che non stai memorizzando nella cache i banner. Spero che bannersPhrases sia una raccolta fissa, perché se è troppo un 'IEnumerable' allora verrà rigenerato per ogni pagina. – xanatos

6

È possibile utilizzare .Skip() .Questo restituirà i prossimi 10 articoli:

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

È possibile utilizzare Skip estensione metodo

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

Se stai facendo il paging e si desidera solo per salta a una pagina specifica puoi usare Skip e Take come descritto in alcune delle altre risposte. Tuttavia, se si desidera raggruppare l'intera sequenza in blocchi di una determinata dimensione, è possibile utilizzare invece GroupBy. Ecco un piccolo esempio:

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)); 

Il risultato è:

 
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

Potresti spiegare come funziona la tua query linq? Ho sempre pensato che tu avessi accesso solo all'elemento di raccolta in una query di selezione. Qui hai accesso all'elemento della raccolta più un immaginario io, che non capisco da dove provenga. –

+1

@ParthShah: non è un "io immaginario". È l'indice dell'elemento nella sequenza sorgente. Il sovraccarico che sto usando è [documentato su MSDN] (http://msdn.microsoft.com/en-us/library/bb534869 (v = vs.110) .ASPX). Progetto la sequenza sorgente in una sequenza che incorpora l'indice che poi uso per raggruppare. –

+1

Mi dispiace per averlo chiamato immaginario. Wow, questa è una domanda interessante! Lei ha meritato il mio voto! –

Problemi correlati