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

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

问题描述:

我想用Linq查询我的项目中的公交时刻表,以便我随时可以获得下5辆公交车到达时间。我怎样才能限制我的查询前5个结果?如何在C#中获得列表的前N个元素?

更一般地,我怎么可以在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); 
+55

如果列表中只包含3个项目,是否会引发异常?或者它会多达5个? – 2012-02-22 21:08:05

+53

@bobek:它不会抛出异常。它只是返回它没有足够的元素时所具有的。 – 2012-09-19 04:15:10

+0

准确,没有抛出异常跳过,并采取综合解决我的问题,因为我想采取每批 – JohanLarsson 2015-06-24 09:02:05

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

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

采取第一5个元素更好地使用表达像这样的:

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

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

它将比ORDERBY变快,因为LINQ发动机将由于延迟执行而不扫描所有列表,并且不会对所有数组进行排序。

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