如何实现IComparable来排序数字和非数字字符串

时间:2009-12-04 10:46:57

标签: linq-to-xml icomparable

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

首先,我想在“列表”中获取最小值和最大值。

它要求我实施ICompareable。 “至少有一个对象必须实现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>

2 个答案:

答案 0 :(得分:1)

您正在尝试获取Min()和Max()元素为了能够在其上调用Min(),XElement应该实现IComparable。因为它没有,你不能直接调用元素集合上的Min。

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

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

答案 1 :(得分:0)

这是因为您要求最小和最大XElement对象,并且框架不知道如何比较XElement,因为它没有实现IComparablevar elements的确评估为IEnumerable<XElement> elements

另请注意,您的代码效率不高,因为您首先排序然后再循环两次列表,一次为Min,一次为Max。

Yann的解决方案既更有效又可行:

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