0

如何实现 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>
4

2 回答 2

1

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

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

var ordered = elements.OrderBy(e => e.Value).ToList();
var min = ordered.First().Value;
var max = ordered.Last().Value;
于 2009-12-04T10:55:08.160 回答
0

这是因为您要的是最小和最大XElement对象,而框架不知道如何比较XElements 因为它没有实现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;  
于 2009-12-04T11:13:19.503 回答