2

我首先这样做是为了在 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++;
        }

所以我尝试在List<IEnumerable<XElement>>之前添加演员,LevelData.root. 但后来我得到了一个无效的演员异常。我在一块砖墙上去哪里。有什么建议吗?

4

4 回答 4

5

Where方法不返回 a List<>,它返回 an IEnumerable<>,它在枚举时是惰性求值的。

如果您想要一个实际的对象,请在末尾List<>粘贴 a ,这样就可以了。.ToList()

于 2013-02-11T21:36:21.883 回答
4
var world1 = LevelData.root
                           .Elements("world")
                           .Where(element => (int?)element.Attribute("id") == 1)
                           .ToList();

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

于 2013-02-11T21:36:11.027 回答
2

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

List<XElement> world1 = LevelData.root
    .Elements("world")
    .Where(element => (int?)element.Attribute("id") == 1)
    .ToList();
于 2013-02-11T21:37:09.670 回答
2

您的问题有点令人困惑,您似乎有一个数组,List<IEnumerable<XElement>>并且您正在尝试将 a 分配IEnumerable<XElement>给它。

如果你只是想要这个应该List工作IEnumerable<XElement>

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
}
于 2013-02-11T21:55:39.100 回答