Linq to xml 如何实现IComparable对数字和非数字字符串进行排序

Linq to xml 如何实现IComparable对数字和非数字字符串进行排序,linq-to-xml,icomparable,Linq To Xml,Icomparable,如何实现IComparable对数字和非数字字符串进行排序 首先,我想得到“列表”中的最小值和最大值。 它要求我实现iComparable。“至少一个对象必须实现IComparable” 有人能帮我吗?这是我的密码: // setup string filePath1 = Directory.GetCurrentDirectory().ToLower().Replace(@"\bin\debug", string.Empty) + @"\S

如何实现IComparable对数字和非数字字符串进行排序

首先,我想得到“列表”中的最小值和最大值。

它要求我实现iComparable。“至少一个对象必须实现IComparable”

有人能帮我吗?这是我的密码:

        // setup
        string filePath1 = Directory.GetCurrentDirectory().ToLower().Replace(@"\bin\debug", string.Empty)
            + @"\SampleData\products.xml";

        // load XML
        var xdoc1 = XElement.Load(filePath1);


        //list
        var elements = xdoc1.Descendants("ProductName").OrderBy(x => x.Value);

        //output
        Console.WriteLine("Min- " + elements.Min().Value);
        Console.WriteLine("Max- " + elements.Max().Value);

这是我的XML文件:

<Products>
  <ProductName>9954</ProductName>
  <ProductName>987</ProductName>
  <ProductName>197</ProductName>
  <ProductName>56</ProductName>
  <ProductName>rr45</ProductName>
  <ProductName>ad4</ProductName>
  <ProductName>7</ProductName>
  <ProductName>69dd</ProductName>
  <ProductName>69</ProductName>
  <ProductName>197abc</ProductName>
</Products>

9954
987
197
56
rr45
ad4
7.
69日
69
197abc

您试图获取Min()和Max()元素以便能够对其调用Min(),XElement应该实现IComparable。因为它不是,所以不能直接在元素集合上调用Min

为什么不尝试按值对元素进行排序,并取第一个和最后一个

var ordered = elements.OrderBy(e => e.Value).ToList();
var min = ordered.First().Value;
var max = ordered.Last().Value;

这是因为您要求最小和最大
XElement
对象,而框架不知道如何比较
XElement
s,因为它没有实现
IComparable
<代码>变量元素的计算结果实际上是
IEnumerable元素

还要注意的是,您的代码不是很有效,因为您首先排序,然后在列表中循环两次,一次用于Min,一次用于Max

Yann的解决方案不仅效率更高,而且会起作用:

var ordered = elements.OrderBy(e => e.Value).ToList();      
var min = ordered.First().Value;      
var max = ordered.Last().Value;  

感谢您的帮助,但我想知道如何使用elements.OrderBy(e=>e.Value).Min()完成此操作。你知道如何实现IComparable接口吗。谢谢Yann。你不能,因为元素没有实现IComparable,而Min需要IComparable。或者你可以执行elements.OrderBy(e=>e.Value)。Select(e=>e.Value)。Min()但是你不会得到元素,只有值。对不起,elements.Select(e=>e.Value)。Min()更好。