【问题标题】:Convert IEnumerable<int[][]> to int[][]将 IEnumerable<int[][]> 转换为 int[][]
【发布时间】:2014-01-09 00:32:54
【问题描述】:

在 C# 中从 XML 文件初始化锯齿状数组。从调试器中可以看到,以下代码似乎可以创建我想要的数据结构,但代码返回一个 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... 等?

【问题讨论】:

  • 你有后代 * 行 * 列。那是3D,你想要2D。这才是真正的问题。我猜你只有一个文档,对吧?
  • 你有三个级别的枚举,所以在锯齿状数组中会有三个级别的深度。您可以有多个“文档”,可以有多个“行”,可以有多个“列”。您想组合哪些数组以使您只有两个级别?

标签: c# linq ienumerable jagged-arrays


【解决方案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());

【讨论】:

  • 是的,只有一个 doc 元素。我想我应该重新考虑在这种情况下使用Descendants。谢谢大家的修复。你们这么快就回来了……!
  • @是的,你绝对应该考虑像这样使用DescendantsWhy (or when) you should/shouldn't use Descendants() method
  • 好文章,马辛。谢谢!
  • 对于以后阅读本文的任何人,这里是最终有效的代码,使用 Marcin 的文章:int[][] ia = (from e in XDocument.Load("Test.xml").Element("doc").Elements("rows") select ( from cols in e.Elements("cols") select int.Parse(cols.Value)).ToArray()).ToArray();
  • 如果doc 是您文档中的根元素,您可以将Load().Element("doc").Elements() 更改为Load().Root.Elements()
【解决方案2】:

你有后代 * 行 * 列。那是3D,你想要2D。我猜你希望你的 xml 文件中只有一个“doc”后代。您可以使用 Single 进行验证,当集合中有多个项目时会失败,这意味着多个“文档”:

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());

【讨论】:

  • 谢谢 - i3arnon 也会检查一下。
猜你喜欢
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
相关资源
最近更新 更多