【问题标题】:Multi-dimensional arrays in LinqLinq 中的多维数组
【发布时间】:2009-11-10 10:44:15
【问题描述】:

我有一个类似于以下的 XML 文件:

<novel>
  <paragraphs>
     <paragraph>
         <choice>This is paragraph 1</choice>
         <choice>Paragraph 1 alternative text</choice>
     </paragraph>
     <paragraph>
         <choice>This is paragraph 2</choice>
         <choice>Paragraph 2 alternative text</choice>
     </paragraph>
  </paragraphs>
</novel>

我正在使用 LINQ 将其读入我的程序中。我还在学习LINQ。我想要段落和选项的二维数组映射,即 Paragraph[0][0] = "This is paragraph 1" 和 Paragraph[1][1] = "Paragraph 2 Alternative text"。

问题是我不确定如何在 LINQ 中嵌套这些数组。此刻我有:

var paragraphsQuery =
   from paragraphsNode in xDoc.Elements("novel").Elements("paragraphs")
   from choiceNodes in paragraphsNode.Elements("paragraph").Elements("choice")
   select choiceNodes.Value;

...但这给了我所有选择组合的一个数组(我失去了段落分隔)。似乎不知何故我需要从 select 中的语句中做更多的事情?

谁能给我任何建议?谢谢。

【问题讨论】:

    标签: xml linq


    【解决方案1】:

    你需要这样的东西:

    var paragraphsQuery = xDoc.Elements("novel")
                              .Elements("paragraphs")
                              .Elements("paragraph")
                              .Select(p => p.Elements("choice")
                                            .Select(c => c.Value)
                                            .ToList())
                              .ToList();
    

    换句话说,在顶层,您希望每个“段落”元素有一个项目。然后对于每个项目,您要找到“选择”元素的值,并将它们变成一个列表。

    (这将使用列表而不是数组 - 如果您真的需要,您可以使用数组,但列表通常更易于使用。)

    【讨论】:

    • 列表比数组更大、更慢且更易变——向复杂查询结果添加或删除元素是我从未需要的。为什么不坚持使用重量更轻、性能更好的数组?
    • 此外,当涉及到“较慢”时 - 调用 ToArray 可能会导致比 ToList 完成更多的复制。至于“表现更好” - 引用类型数组上可用的差异,事实上存在诸如 Add 和 Remove 之类的操作可用但在执行时抛出......这些都没有让我觉得“表现更好”。
    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多