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

时间:2008-11-26 07:26:47

标签: c#

我想使用Linq来查询我项目中的公交时刻表,以便随时可以获得下一个5个公交车到达时间。如何将查询限制为前5个结果?

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

5 个答案:

答案 0 :(得分:615)

var firstFiveItems = myList.Take(5);

或切片:

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

当然,按照某种顺序获得前五个项目通常很方便:

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

答案 1 :(得分:65)

如果有人有兴趣(即使问题没有要求这个版本),在C#2中会是:(我已根据一些建议编辑了答案)

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

答案 2 :(得分:3)

pagination一样,您可以使用以下公式来获取slice of list or elements

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

示例1:前五项

var pageNumber = 1;
var pageSize = 5;

示例2:后五项

var pageNumber = 2;
var pageSize = 5;

示例3:第五项

var pageNumber = 3;
var pageSize = 5;
  

如果对公式参数pageSize = 5pageNumber的通知发生变化,如果您想要更改切片中的项目数,请更改pageSize

答案 3 :(得分:1)

要使前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)
    }
}

答案 4 :(得分:0)

        dataGridView1.DataSource = (from S in EE.Stagaire
                                    join F in EE.Filiere on
                                    S.IdFiliere equals F.IdFiliere
                                    where S.Nom.StartsWith("A")
                                    select new
                                    {
                                        ID=S.Id,
                                        Name = S.Nom,
                                        Prénon= S.Prenon,
                                        Email=S.Email,
                                        MoteDePass=S.MoteDePass,
                                        Filiere = F.Filiere1
                                    }).Take(1).ToList();