Come ottenere i primi N elementi di una lista in C #?

Vorrei usare Linq per interrogare un programma di bus nel mio progetto, in modo che in qualsiasi momento possa ottenere i prossimi 5 orari di arrivo degli autobus. Come posso limitare la mia query ai primi 5 risultati?

Più in generale, come posso prendere una porzione di un elenco in C #? (In Python mylist[:5] per ottenere i primi 5 elementi.)

 var firstFiveItems = myList.Take(5); 

O per tagliare:

 var secondFiveItems = myList.Skip(5).Take(5); 

E, naturalmente, spesso è conveniente ottenere i primi cinque articoli secondo un qualche tipo di ordine:

 var firstFiveArrivals = myList.OrderBy(i => i.ArrivalTime).Take(5); 

Nel caso in cui qualcuno sia interessato (anche se la domanda non richiede questa versione), in C # 2 sarebbe: (Ho modificato la risposta, seguendo alcuni suggerimenti)

 myList.Sort(CLASS_FOR_COMPARER); List fiveElements = myList.GetRange(0, 5); 

Per utilizzare meglio i primi 5 elementi, usa espressioni come questa:

var firstFiveArrivals = myList.Where([EXPRESSION]).Take(5);

o

var firstFiveArrivals = myList.Where([EXPRESSION]).Take(5).OrderBy([ORDER EXPR]);

Sarà più veloce della variante orderBy, perché il motore LINQ non eseguirà la scansione di tutto l’elenco a causa dell’esecuzione ritardata e non ordinerà tutto l’array.

 class MyList : IEnumerable { int maxCount = 0; public int RequestCount { get; private set; } public MyList(int maxCount) { this.maxCount = maxCount; } public void Reset() { RequestCount = 0; } #region IEnumerable Members public IEnumerator GetEnumerator() { int i = 0; while (i < maxCount) { RequestCount++; yield return i++; } } #endregion #region IEnumerable Members System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { throw new NotImplementedException(); } #endregion } class Program { static void Main(string[] args) { var list = new MyList(15); list.Take(5).ToArray(); Console.WriteLine(list.RequestCount); // 5; list.Reset(); list.OrderBy(q => q).Take(5).ToArray(); Console.WriteLine(list.RequestCount); // 15; list.Reset(); list.Where(q => (q & 1) == 0).Take(5).ToArray(); Console.WriteLine(list.RequestCount); // 9; (first 5 odd) list.Reset(); list.Where(q => (q & 1) == 0).Take(5).OrderBy(q => q).ToArray(); Console.WriteLine(list.RequestCount); // 9; (first 5 odd) } } 

Come l’ pagination puoi usare sotto il formule per prendere una slice of list or elements :

 var slice = myList.Skip((pageNumber - 1) * pageSize) .Take(pageSize); 

Esempio 1: primi cinque articoli

 var pageNumber = 1; var pageSize = 5; 

Esempio 2: secondi cinque articoli

 var pageNumber = 2; var pageSize = 5; 

Esempio 3: terzo cinque articoli

 var pageNumber = 3; var pageSize = 5; 

Se si notano i parametri di formule pageSize = 5 e pageNumber sta cambiando, se si desidera modificare il numero di elementi in slicing si modifica pageSize .