如何转换为List <ienumerable <xelement>&gt; </ienumerable <xelement>

时间:2013-02-11 21:33:24

标签: c# list casting ienumerable xelement

我首先要在父节点下返回一组特定的节点,这些节点的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&gt;'。存在显式转换(您是否错过了演员?)

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 个答案:

答案 0 :(得分:5)

Where方法不会返回List<>,它会返回IEnumerable<>,在枚举时会对其进行延迟评估。

如果您想要一个实际的List<>对象,请在最后添加.ToList(),这样就可以了。

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

您可以致电IEnumerable<T>

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

答案 3 :(得分:2)

您的问题有点令人困惑,您似乎有List<IEnumerable<XElement>>数组,并且您正在尝试为其分配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
}