2008-11-26 4 views
276

Я хотел бы использовать Linq для запроса расписания автобусов в моем проекте, так что в любое время я могу получить следующие 5 прибытий на автобус. Как я могу ограничить свой запрос до первых 5 результатов?Как получить первые N элементов списка в C#?

В общем, как я могу взять фрагмент списка в C#? (В Python я хотел бы использовать mylist[:5], чтобы получить первые 5 элементов.)

ответ

504
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

точно, никакие исключения не выбрасывались Пропустить и принять вместе решили мою проблему, так как я хотел взять любую общую коллекцию и обрабатывать x элементов за партию – JohanLarsson 2015-06-24 09:02:05

57

в случае, если кто заинтересован (даже если вопрос не требует этой версии), в C# 2 будет: (я редактировал ответ, следующие несколько предложений)

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

Для того, чтобы первые 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) 
    } 
}