[C#] C #에서 목록의 첫 번째 N 요소를 얻는 방법은 무엇입니까?

Linq를 사용하여 프로젝트에서 버스 일정을 쿼리하여 언제든지 다음 5 개의 버스 도착 시간을 얻을 수 있습니다. 검색어를 처음 5 개의 결과로 제한하려면 어떻게해야합니까?

더 일반적으로 C #에서 목록을 어떻게 가져갈 수 있습니까? (파이썬에서는 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에서는 다음과 같습니다.

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


답변

pagination당신이 복용을 위해 아래 공식을 사용할 수있는 것처럼 slice of list or elements:

var slice = myList.Skip((pageNumber - 1) * pageSize)
                  .Take(pageSize);

예 1 : 처음 5 개 항목

var pageNumber = 1;
var pageSize = 5;

예 2 : 두 번째 다섯 항목

var pageNumber = 2;
var pageSize = 5;

예 3 : 세 번째 다섯 항목

var pageNumber = 3;
var pageSize = 5;

매개 변수를 공식화 pageSize = 5하고 pageNumber변경하는 경우 슬라이싱에서 항목 수를 변경하려면을 변경하십시오 pageSize.


답변

처음 5 개 요소를 가져 오려면 다음과 같이 식을 더 잘 사용하십시오.

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

또는

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

LINQ 엔진은 실행 지연으로 인해 모든 목록을 검색하지 않고 모든 배열을 정렬하지 않기 때문에 orderBy 변형보다 빠릅니다.

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


답변