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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/319973/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-03 23:03:06  来源:igfitidea点击:

How to get first N elements of a list in C#?

c#

提问by RexE

I would like to use Linq to query a bus schedule in my project, so that at any time I can get the next 5 bus arrival times. How can I limit my query to the first 5 results?

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

More generally, how can I take a slice of a list in C#? (In Python I would use mylist[:5]to get the first 5 elements.)

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

采纳答案by Matt Hamilton

var firstFiveItems = myList.Take(5);

Or to slice:

或者切片:

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

And of course often it's convenient to get the first five items according to some kind of order:

当然,根据某种顺序获取前五个项目通常很方便:

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

回答by netadictos

In case anyone is interested (even if the question does not ask for this version), in C# 2 would be: (I have edited the answer, following some suggestions)

如果有人感兴趣(即使问题不要求此版本),在 C# 2 中将是:(我已经编辑了答案,遵循一些建议)

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

回答by Valera Kolupaev

To take first 5 elements better use expression like this one:

要使用前 5 个元素更好地使用这样的表达式:

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

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

or

或者

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

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

It will be faster than orderBy variant, because LINQ engine will not scan trough all list due to delayed execution, and will not sort all array.

它会比 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)
    }
}

回答by Sina Lotfi

Like paginationyou can use below formule for taking slice of list or elements:

就像pagination你可以使用下面的公式来取slice of list or elements

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

Example 1: first five items

示例 1:前五项

var pageNumber = 1;
var pageSize = 5;

Example 2: second five items

例二:后五项

var pageNumber = 2;
var pageSize = 5;

Example 3: third five items

例3:第三五项

var pageNumber = 3;
var pageSize = 5;

If notice to formule parameters pageSize = 5and pageNumberis changing, if you want to change number of items in slicing you change pageSize.

如果通知一级方程式参数pageSize = 5pageNumber正在发生变化,如果你想在切片项目的更改号码更改pageSize