【问题标题】:How to use Linq to set attributes based on counter如何使用Linq根据计数器设置属性
【发布时间】:2008-11-21 16:33:34
【问题描述】:

假设我有一个看起来像这样的 xml 文档

<foo>
<bar id="9" />
<bar id="4" />
<bar id="3" />
</foo>

我想使用 linq 将 id 重置为 0、1、2。 最简单的方法是什么?

谢谢

【问题讨论】:

    标签: linq linq-to-xml


    【解决方案1】:
    XElement xml = GetXml();
    var i = 0;
    foreach (var e in xml.Elements("bar"))
      e.SetAttributeValue("id", i++);
    

    【讨论】:

      【解决方案2】:

      您可以使用 linq 方法而不是 foreach 来做到这一点,但没有太多好处:

      XElement xml = GetXml();
      int updatedElements = xml.Elements("bar")
          .Select((x, i) =>
          {
              x.SetAttributeValue("id", i);
              return x;
          })
          .Count();
      

      这里,Count() 方法是枚举查询所必需的。任何枚举查询都可以。

      如果使用 Select 作为 mutator 让您感到困扰(就像我一样),请改用 List(T).ForEach:

      XElement xml = GetXml();
      xml.Elements("bar")
          .Select( (x, i) => new {x, i})
          .ToList()
          .ForEach(a => a.x.SetAttributeValue("id", a.i));
      

      【讨论】:

      • 在大多数情况下,我们可以获得比带有查询的语句更简单的代码。但在这种情况下似乎不是。
      • 当然,函数式编程技术不太擅长产生副作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多