使用xml linq和c#循环遍历特定属性并获取其最低值

时间:2016-12-19 08:08:41

标签: c# xml linq

如何获得属性值的最低值和最高值?

<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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

试试这个:

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

答案 2 :(得分:1)

如果您需要获取一个特定属性的最高值和最低值,那么在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)
                                       }
                         );