我想使用Linq來查詢我項目中的公交時刻表,以便隨時能夠得到下一個5次公交車到達時間。 如何將查詢限制爲前5個結果? 數組
更通常地說,我如何在C#中獲取一個列表? (在Python中我會使用mylist[:5]
來獲取前5個元素。) this
var firstFiveItems = myList.Take(5);
或切片: spa
var secondFiveItems = myList.Skip(5).Take(5);
固然,按照某種順序獲取前五個項目一般很方便: code
var firstFiveArrivals = myList.OrderBy(i => i.ArrivalTime).Take(5);
若是有人有興趣(即便問題沒有要求這個版本),在C#2中將是:(我已經編輯了答案,遵循一些建議) orm
myList.Sort(CLASS_FOR_COMPARER); List<string> fiveElements = myList.GetRange(0, 5);
要得到前5個元素更好地使用這樣的表達式: 排序
var firstFiveArrivals = myList.Where([EXPRESSION]).Take(5);
ip
要麼 element
var firstFiveArrivals = myList.Where([EXPRESSION]).Take(5).OrderBy([ORDER EXPR]);
get
它將比orderBy變體更快,由於LINQ引擎不會由於執行延遲而掃描全部列表,而且不會對全部數組進行排序。 string
class MyList : IEnumerable<int> { int maxCount = 0; public int RequestCount { get; private set; } public MyList(int maxCount) { this.maxCount = maxCount; } public void Reset() { RequestCount = 0; } #region IEnumerable<int> Members public IEnumerator<int> 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) } }
像pagination
同樣,您能夠使用下面的公式來獲取slice of list or elements
:
var slice = myList.Skip((pageNumber - 1) * pageSize) .Take(pageSize);
例1:前五項
var pageNumber = 1; var pageSize = 5;
示例2:後五項
var pageNumber = 2; var pageSize = 5;
例3:第五項
var pageNumber = 3; var pageSize = 5;
若是注意到formule參數
pageSize = 5
而且pageNumber
正在更改,若是要更改切片中的項目數,則更改pageSize
。