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

Rex*_*exE 349 c#

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

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

Mat*_*ton 646

var firstFiveItems = myList.Take(5);
Run Code Online (Sandbox Code Playgroud)

或切片:

var secondFiveItems = myList.Skip(5).Take(5);
Run Code Online (Sandbox Code Playgroud)

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

var firstFiveArrivals = myList.OrderBy(i => i.ArrivalTime).Take(5);
Run Code Online (Sandbox Code Playgroud)

  • 如果列表中只有3个项目,它会抛出异常吗?或者它需要多达5个? (80认同)
  • @bobek:它没有抛出异常.如果没有足够的元素,它只返回它所拥有的东西. (80认同)
  • 需要注意的是`.Take(n)`返回一个TakeIterator;它不会返回其中包含“n”元素的列表(假设有许多元素可用)。对 Take 的结果使用 .ToArray() 或 .ToList() 来获取具体的数组或列表。 (5认同)

net*_*tos 67

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

myList.Sort(CLASS_FOR_COMPARER);
List<string> fiveElements = myList.GetRange(0, 5);
Run Code Online (Sandbox Code Playgroud)

  • List&lt;T&gt;.Sort 返回 void;您需要进行排序,然后单独使用 GetRange。您还可以使用比较&lt;T&gt; 匿名方法来消除对 CLASS_FOR_COMPARER 的需要。 (2认同)

Hei*_*aen 6

工作示例:

    [Test]
    public void TestListLinqTake()
    {
        List<string> elements = new List<string>() { "storm", "earth", "fire"};
        List<string> noErrorThrown = elements.Take(5).ToList();
        List<string> someElements = elements.Take(2).ToList();

        Assert.True(
            someElements.First().Equals("storm") &&
            someElements.Count == 2 &&
            noErrorThrown.Count == 3);
    }
Run Code Online (Sandbox Code Playgroud)

别忘了

using System.Linq;
Run Code Online (Sandbox Code Playgroud)

基于贝拉明头的评论


Sin*_*tfi 5

就像pagination您可以使用以下公式进行服用slice of list or elements

var slice = myList.Skip((pageNumber - 1) * pageSize)
                  .Take(pageSize);
Run Code Online (Sandbox Code Playgroud)

示例1:前五个项目

var pageNumber = 1;
var pageSize = 5;
Run Code Online (Sandbox Code Playgroud)

示例2:后五个项目

var pageNumber = 2;
var pageSize = 5;
Run Code Online (Sandbox Code Playgroud)

示例3:前五个项目

var pageNumber = 3;
var pageSize = 5;
Run Code Online (Sandbox Code Playgroud)

如果通知配方参数pageSize = 5并且pageNumber正在更改,则要更改切片中的项目数,请更改pageSize