微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 foreach 循环中从 XElement 添加到列表

如何解决在 foreach 循环中从 XElement 添加到列表

程序.cs

using ConsoleApp2.Models;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            string City_Name = "Gdańsk";
            var doc = XElement.Load($"https://maps.googleapis.com/maps/api/place/textsearch/xml?key={key}&query=restaurants+in+{City_Name}&language=pl&fields=place_id");
            List<PlaceIdModel> IdList = doc.Descendants("result").Select(n => new PlaceIdModel
            {
                PlaceId = n.Element("place_id").Value

            }).ToList();
            List<PlaceDetailsModel> placeDetailsModel = new List<PlaceDetailsModel>();
            foreach (var item in IdList)
            {
                var doc2 = XElement.Load($"https://maps.googleapis.com/maps/api/place/details/xml?key={key}&place_id={item.PlaceId}&language=pl&fields=name,vicinity,geometry/location,rating,website,opening_hours/weekday_text");
                placeDetailsModel = doc2.Descendants("result").Select(x => new PlaceDetailsModel
                {
                    Name = x.Element("name").Value,Vicinity = x.Element("vicinity").Value,rating = x.Element("rating").Value,Website = x.Element("website").Value,Lat = x.Element("geometry").Element("location").Element("lat").Value,Lng = x.Element("geometry").Element("location").Element("lng").Value,opening_hours = x.Descendants("weekday_text").Select(y => y.Value).ToList()
                }).ToList();
            };
        }
    }
}

PlaceIdModel.cs

namespace ConsoleApp2.Models
{
    public class PlaceIdModel
    {
        public string PlaceId { get; set; }
    }
}

PlaceDetailsModel.cs

using System.Collections.Generic;

namespace ConsoleApp2.Models
{
    public class PlaceDetailsModel
    {
        public string Name { get; set; }
        public string Vicinity { get; set; }
        public string rating { get; set; }
        public string Website { get; set; }
        public string Lat { get; set; }
        public string Lng { get; set; }
        public List<string> opening_hours { get; set; }
    }
}

我正在使用 goole API 的地方。首先我从城市获取 place_id 然后我想使用循环 foreach 将每个地方的详细信息保存到列表中。每次都保存在 [0] 上,而不是填充整个列表。

解决方法

使用 OpenGL,您每次都在创建一个新列表。而是使用 List.AddRange(IEnumerable) Method 将项目添加到现有列表中。

.ToList()

阅读var placeDetailsModel = new List<PlaceDetailsModel>(); foreach (var item in IdList) { var doc2 = XElement.Load($"https://maps.googleapis.com/maps/..."); placeDetailsModel.AddRange( doc2.Descendants("result") .Select(x => new PlaceDetailsModel { Name = x.Element("name").Value,Vicinity = x.Element("vicinity").Value,Rating = x.Element("rating").Value,Website = x.Element("website").Value,Lat = x.Element("geometry").Element("location").Element("lat").Value,Lng = x.Element("geometry").Element("location").Element("lng").Value,Opening_hours = x.Descendants("weekday_text").Select(y => y.Value).ToList() }) ); } 时不需要.ToList()IdListforeach 配合得很好,它为您节省了不必要的内存分配。:

IEnumerable<T>

我也没有看到使用 IEnumerable<PlaceIdModel> IdList = doc .Descendants("result") .Select(n => new PlaceIdModel { PlaceId = n.Element("place_id").Value }); ... foreach (var item in IdList) ... 类来临时存储 Id 的优势。直接使用这些值:

PlaceIdModel

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。