将IEnumerable <int [] []>转换为int [] [] </int [] []>

时间:2014-01-09 00:32:54

标签: c# linq ienumerable jagged-arrays

从XML文件初始化C#中的锯齿状数组。以下代码似乎可以创建我想要的数据结构,从调试器中可以看到,但代码返回IEnumerable类型的值。

var ia = (from e in XDocument.Load("Test.xml").Descendants("doc")
          select (
              from rows in e.Elements("rows")
              select (
                  from cols in rows.Elements("cols")
                  select int.Parse(cols.Value)
              ).ToArray()
          ).ToArray());

如果我最后再加上.ToArray()(感谢其他StackOverflow文章),我会回来int[1][][]

有关如何使代码正常工作的任何想法,我只需编写int[][] array = (from e in...等等。

2 个答案:

答案 0 :(得分:1)

如果始终只有一个doc元素,您可以执行以下操作:

var ia = (from e in XDocument.Load("Test.xml").Descendants("doc")
          select (
              from rows in e.Elements("rows")
              select (
                  from cols in rows.Elements("cols")
                  select int.Parse(cols.Value)
              ).ToArray()
          ).First().ToArray());

如果您期望多一个doc元素,则可以进行额外的SelectMany调用:

var ia = (from e in XDocument.Load("Test.xml").Descendants("doc")
          select (
              from rows in e.Elements("rows")
              select (
                  from cols in rows.Elements("cols")
                  select int.Parse(cols.Value)
              ).ToArray()
          ).SelectMany(x => x).ToArray());

答案 1 :(得分:0)

你有后代*行* cols。多数民众赞成3D,你想要2D。我猜你的xml文件中只有一个“doc”后代。当集合中有多个项目时,您可以验证Single哪个失败,这意味着不止一个“doc”:

var ia = (from e in XDocument.Load("Test.xml").Descendants("doc")
    select (
        from rows in e.Elements("rows")
        select (
            from cols in rows.Elements("cols")
            select int.Parse(cols.Value)).ToArray()).Single().ToArray());