如何获得C#中的列表的前N个元素?

我想用Linq来查询我的项目中的公车时刻表,以便在任何时候我都能得到下5辆公交车到达时间。 我怎样才能限制我的查询前5个结果?

更一般地说,我怎样才能在C#中获取一个列表? (在Python中,我会使用mylist[:5]来获取前5个元素。)

 var firstFiveItems = myList.Take(5); 

或切片:

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

当然,按照某种顺序获得前五项是很方便的:

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

如果任何人有兴趣(即使这个问题不要求这个版本),在C#2将是:(我已经编辑了答案,下面的一些build议)

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

采取前5个元素更好地使用这样的expression:

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

要么

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

它将比orderBy变种更快,因为LINQ引擎由于延迟执行而不会扫描所有列表,并且不会对所有数组进行sorting。

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