如何转换为列表<;IEnumerable<;XElement>>;

本文关键字:lt gt IEnumerable XElement 列表 何转换 转换 | 更新日期: 2023-09-27 17:58:47

我首先这样做是为了在id等于1的父节点下返回一组特定的节点,这非常有效。

IEnumerable<XElement> world1 = LevelData.root.
                               Elements("world").
                               Where(element => (int?)element.Attribute("id") == 1);

但我需要多次这样做,每个实例都有自己的实例,所以我想把它们放在一个列表中,但它甚至没有编译,告诉我错误CS0266:

无法将类型"System.Collections.Generic.IEnumerable"隐式转换为"System.Collections.Generic.List>"。存在显式转换(是否缺少强制转换?)

List<IEnumerable<XElement>>[] World = new List<IEnumerable<XElement>>[noofworlds];
        foreach (List<IEnumerable<XElement>> wn in World)
        {
            Debug.WriteLine("World: "+w);
            //this will make a list of all the nodes (elements) within the world specified by the id tag
            World[w] =  LevelData.Root.Elements("world").Where(element => (int?)element.Attribute("id") == 1);//with id == to i
            w++;
        }

所以我尝试在LevelData.root.之前添加演员阵容List<IEnumerable<XElement>>但后来我得到了一个invalidcastexception。我在一堵砖墙前,不知道该去哪里。有什么建议吗?

如何转换为列表<;IEnumerable<;XElement>>;

Where方法不返回List<>,而是返回IEnumerable<>,在枚举时对其进行延迟求值。

如果你想要一个真正的List<>对象,在末尾粘贴一个.ToList(),就可以了

var world1 = LevelData.root
                           .Elements("world")
                           .Where(element => (int?)element.Attribute("id") == 1)
                           .ToList();

您需要使用ToList()将其从IEnumerable转换过来,因为IList接口比IEnumeraable接口支持更多的功能。

您可以通过调用ToList()IEnumerable<T>转换为List<T>

List<XElement> world1 = LevelData.root
    .Elements("world")
    .Where(element => (int?)element.Attribute("id") == 1)
    .ToList();

您的问题有点令人困惑,您似乎有一个List<IEnumerable<XElement>>数组,并且您正试图为其分配一个IEnumerable<XElement>

如果你只想要IEnumerable<XElement>List,这应该可以

List<IEnumerable<XElement>> World = new List<IEnumerable<XElement>>();
for (int i = 0; i < noofworlds; i++)
{
    World.Add(LevelData.Root.Elements("world").Where(element => (int?)element.Attribute("id") == i));//with id == to i
}

否则,tou将不得不创建一个新列表来添加到数组中,并将IEnumerable<XElement>添加到该列表中。

List<IEnumerable<XElement>>[] World = new List<IEnumerable<XElement>>[noofworlds];
for (int i = 0; i < noofworlds; i++)
{
    World[i] = new List<IEnumerable<XElement>> { (LevelData.Root.Elements("world").Where(element => (int?)element.Attribute("id") == i)) };//with id == to i
}