问答中心分类: C#如何在 C# 中获取列表的前 N ​​个元素?
0
匿名用户 提问 23分钟 前

我想在我的项目中使用 Linq 查询公交时刻表,以便随时可以获取接下来的 5 趟公交车到达时间。如何将查询限制为前 5 个结果?
更一般地说,如何在 C# 中获取列表的一部分? (在 Python 中我会使用mylist[:5]获取前 5 个元素。)

5 Answers
0
netadictos 回答 23分钟 前

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

myList.Sort(CLASS_FOR_COMPARER);
List<string> fiveElements = myList.GetRange(0, 5);
AlexeyMK 回复 23分钟 前

也许也添加一个匿名谓词?

Marc Gravell 回复 23分钟 前

List.Sort 返回 void;您需要排序,然后单独使用 GetRange。您也可以使用比较匿名方法来消除对 CLASS_FOR_COMPARER 的需要。

Marc Gravell 回复 23分钟 前

@AlexeyMK – 你的意思是比较,而不是谓词(谓词) – 谓词用于过滤数据

ToolmakerSteve 回复 23分钟 前

我相信这个答案即使在现在、10 年和许多 C# 版本之后也很有用。对于您有列表的特定情况。特别是如果您要跳过许多项目。例如,您有一个包含 100 万个项目的列表,并且您想要其中的 5 个切片,在列表中很远。 GetRange 确切地知道去哪里抓取它们。不知道有没有Skip+Take一样聪明,或者是否枚举跳过的项目。而且我不需要知道——我只使用 GetRange(当给定一个列表时)。只要确保你意识到第二个参数是数数(而不是最后索引)。

Bellarmine Head 回复 23分钟 前

关于美好的事情.Take(n)是你不必担心如果少于n它工作的序列中的元素。问题与List<T>.GetRange(0, count)是你必须担心……你会得到一个ArgumentException如果没有count项目。

0
Sina Lotfi 回答 23分钟 前

喜欢pagination您可以使用以下公式服用slice of list or elements

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

示例 1:前五项

var pageNumber = 1;
var pageSize = 5;

例二:后五项

var pageNumber = 2;
var pageSize = 5;

例3:第三五项

var pageNumber = 3;
var pageSize = 5;

如果注意制定参数pageSize = 5pageNumber正在改变,如果你想改变切片中的项目数量,你改变pageSize.

0
Heinzlmaen 回答 23分钟 前

工作示例:

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

不要忘记

using System.Linq;

基于 Bellarmine Head 的评论

0
Mouad Amzil 回答 23分钟 前
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();
Connor Low 回复 23分钟 前

嗨 Mouad,谢谢你的回答。虽然您的代码可能会解决已发布问题中的问题,但好的答案可以解释为什么您的解决方案有效。请考虑更新您的问题。

0
Valera Kolupaev 回答 23分钟 前

要获取前 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)
    }
}
Greg Beech 回复 23分钟 前

除了您现在只在选择它们后订购前 5 个元素。它可能更快,但它也有不同的语义,这不太可能是人们真正想要实现的目标。