Как получить первые N элементов списка в С#?

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

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

Ответ 1

var firstFiveItems = myList.Take(5);

Или нарезать:

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

И, конечно, часто бывает удобно получить первые пять предметов в соответствии с каким-то порядком:

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

Ответ 2

Если кому-то интересно (даже если вопрос не запрашивает эту версию), в С# 2 будет: (я отредактировал ответ, следуя некоторым предложениям)

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

Ответ 3

Чтобы взять первые 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)
    }
}