可以在 C# 的 HtmlAgilityPack 中使用 LINQ 吗?

It is possible to use LINQ in HtmlAgilityPack in C#?

我学习C#并尝试编写一个简单的应用程序。想问你关于帮助我优化下面的代码。 我写了 2 个方法并考虑使用 yield 和 LINQ 让它变得更好。想想这是否可能?

    public List<string> getsSubpagesUrls(int subpages)
    {
        List<string> subpagesUrls= new List<string>();
        for (int i = 1; i < subpages; i++)
        {
            string singleUrl = $"url/search%&page={i}";
            subpagesUrls.Add(singleUrl);
        }
        return subpagesUrls;
    }

    public List<string> getAllAnnouncementIds(int numberOfSubpages)
    {
        List<string> annIds = new List<string>();
        foreach (var url in getsSubpagesUrls(numberOfSubpages))
        {
            HtmlWeb web = new HtmlWeb();
            var htmlDoc = web.Load(url);
            var htmlBody = htmlDoc.DocumentNode.SelectNodes("//xpath");
            var ids = htmlBody.Elements("element");
            foreach (var id in ids)
            {
                annIds.Add(id.Attributes["data-item-id"].Value);
            }
        }
        return annIds;
    }

要使用 yield 关键字,您将获得 return 一个 IEnumerable 函数,我稍微重构了您的代码:

        public IEnumerable<string> getsSubpagesUrls(int subpages)
            => Enumerable.Range(1, subpages).Select(i => new string($"url/search%&page={i}"));

        public IEnumerable<string> getAllAnnouncementIds(int numberOfSubpages)
        {
            HtmlWeb web = new HtmlWeb();

            foreach (var url in getsSubpagesUrls(numberOfSubpages))
            {
                var htmlDoc = web.Load(url);
                var htmlBody = htmlDoc.DocumentNode.SelectNodes("//xpath");
                var ids = htmlBody.Elements("element");
                foreach (var id in ids)
                {
                    yield return id.Attributes["data-item-id"].Value;
                }
            }
        }