【问题标题】:loop through specific attribute using xml linq and c# and get its lowest value使用 xml linq 和 c# 循环遍历特定属性并获取其最小值
【发布时间】:2016-12-19 23:00:04
【问题描述】:

如何获取属性值的最小值和最大值?

<parent>
  <anothertag value="20" />
  <body>
    <monitor value="3" />
    <mouse value="5" />
    <chair>
      <monoblock value="5" />
    </chair>
  </body>
</parent>

这是我的代码

string xml = "<parent>" +
                "<anothertag value=\"20\"/>" +
                "<body>" +
                "<monitor value=\"3\"/>" +
                "<mouse value=\"5\"/>" +
                "<chair>" +
                "<monoblock value=\"5\"/>" +
                "</chair>" +
                "</body>" +
                "</parent>";
                XDocument doc = XDocument.Parse(xml);
                Console.WriteLine("value: " + doc.Descendants().ToList().Attributes("value").Min());

但我有一个错误提示

At least one object must implement IComparable

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    您必须将每个属性值解析为 int:

    Console.WriteLine("value: " + doc.Descendants().ToList().Attributes("value").Select(a => int.Parse(a.Value)).Min());
    

    【讨论】:

      【解决方案2】:

      试试这个:

      Console.WriteLine("value: " + doc.Descendants().Max(x => x.Attribute("value") == null ? 0 : (int)x.Attribute("value")));
      

      【讨论】:

        【解决方案3】:

        如果您需要获取一个特定属性的最高和最低值,那么在 O(n) 中实现这一目标的最佳方法之一是使用 Aggregate 扩展方法:

        var minMax= doc.Descendants()
                       .Where(e=>e.Attribute("value")!=null)
                       .Aggregate(new {
                                        Min = int.MaxValue,
                                        Max = int.MinValue
                                      },
                                  (seed, o) => new 
                                               {
                                                 Min = Math.Min((int)o.Attribute("value"), seed.Min),
                                                 Max = Math.Max((int)o.Attribute("value"), seed.Max)
                                               }
                                 );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-12-10
          • 2021-07-16
          • 2013-07-05
          • 2018-05-03
          • 2019-12-21
          • 1970-01-01
          • 2016-11-28
          相关资源
          最近更新 更多