【问题标题】:How to read Xml File Using LINQ in C#如何在 C# 中使用 LINQ 读取 Xml 文件
【发布时间】:2010-12-24 14:04:19
【问题描述】:

我有一个类似的 XML 文件

<root>
  <Child val1="1" val2="2"/>
  <Child val1="3" val2="4"/>
  <Child val1="5" val2="6"/>
  <Child val1="7" val2="8"/>
  <Child val1="9" val2="10"/>
  <Child val1="11" val2="12"/>
  <Child val1="13" val2="14"/>
</root>

我需要将val1val2的属性值读取到List&lt;String&gt;

结果列表将包含

{ "1" , "2" , "3" , ........ ,"13" , "14" }

这是我的示例代码:

XDocument XD = XDocument.Load(Application.StartupPath + "\\foo.xml");
List<String> l_lstTemp = XD.Descendants("Child")
                           .Select(X => new List<String> { X.Attribute("val1").Value,
                                                           X.Attribute("val2").Value })
                           .SelectMany(X => X)
                           .Distinct()
                           .ToList();

有没有办法使用Select 而不是selectMany 来做到这一点?

如何修改我现有的expression

【问题讨论】:

    标签: c# xml linq lambda


    【解决方案1】:

    SelectMany 正在做你想做的事——它将字符串列表序列的结果展平为单个字符串序列。您为什么要采用能够准确表达您需要的工作代码并对其进行更改?

    诚然,您可以通过稍微不同地使用SelectMany 来稍微简化它,并使用数组而不是列表来缩短一些东西::

    XDocument doc = XDocument.Load(Application.StartupPath + "\\foo.xml");
    List<String> values = doc.Descendants("Child")
                             .SelectMany(x => new[] { x.Attribute("val1").Value,
                                                      x.Attribute("val2").Value })
                             .Distinct()
                             .ToList();
    

    【讨论】:

      【解决方案2】:

      您的问题场景正是 SelectMany 的用途,所以我认为我们可能尝试做的任何事情来消除它只会使事情复杂化。 :)

      最初的 .Select 返回 IEnumerable 的结果,没有我们得到的 .SelectMany:

      {
       IEnumerable<string> [ "1", "2" ]
       IEnumerable<string> [ "3", "4" ]
       etc...
      }
      

      .SelectMany 采用 IEnumerable 会将初始结果“展平”到另一个 IEnumerable 中,从而为您提供所需的内容:

      {
       IEnumerable<string> [ "1", "2", "3", "4" ]
      }
      

      这是一篇很棒的帖子,描述要好得多A Visual Look at the LINQ SelectMany Operator

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多