【问题标题】:How to cast to a List<IEnumerable<XElement>>如何转换为 List<IEnumerable<XElement>>
【发布时间】:2013-02-11 21:33:24
【问题描述】:

我首先这样做是为了返回父节点下的一组特定节点,其 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&lt;IEnumerable&lt;XElement&gt;&gt; 但后来我得到一个无效的异常。我在一块砖墙上去哪里。有什么建议吗?

【问题讨论】:

  • 您的World 变量是IEnumerables 的XElement 列表数组。我很确定你永远不想这样做。
  • 你为什么不想这样做?有什么缺点?

标签: c# list casting ienumerable xelement


【解决方案1】:

Where 方法不返回 List&lt;&gt;,它返回一个 IEnumerable&lt;&gt;,它在枚举时是惰性求值的。

如果您想要一个实际的List&lt;&gt; 对象,请在末尾添加一个.ToList(),这样就可以了。

【讨论】:

    【解决方案2】:
    var world1 = LevelData.root
                               .Elements("world")
                               .Where(element => (int?)element.Attribute("id") == 1)
                               .ToList();
    

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

    【讨论】:

      【解决方案3】:

      您可以通过调用ToList() 将IEnumerable&lt;T&gt; 转换为List&lt;T&gt;

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

      【讨论】:

        【解决方案4】:

        您的问题有点令人困惑,您似乎有一个 List&lt;IEnumerable&lt;XElement&gt;&gt; 数组,并且您正在尝试为其分配一个 IEnumerable&lt;XElement&gt;。

        如果您只想要IEnumerable&lt;XElement&gt; 中的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
        }
        

        否则你将不得不创建一个新列表以添加到数组中,并将IEnumerable&lt;XElement&gt; 添加到该列表中。

        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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-24
          • 1970-01-01
          相关资源
          最近更新 更多