【问题标题】:How to implement IComparable to sort numerical and non-numerical string如何实现 IComparable 对数字和非数字字符串进行排序
【发布时间】:2009-12-04 10:46:56
【问题描述】:

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

【问题讨论】:

    标签: linq-to-xml icomparable


    【解决方案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;
    

    【讨论】:

    • 感谢您的帮助,但我想知道如何使用 elements.OrderBy(e => e.Value).Min() 来做到这一点。你知道如何实现 IComparable 接口吗?谢谢亚恩。
    • 你不能因为元素没有实现 IComparable 并且 Min 需要一个 IComparable。
    • 或者你可以做 elements.OrderBy(e => e.Value).Select(e => e.Value).Min() 但你不会得到元素,只有值。
    • 对不起,elements.Select(e => e.Value).Min() 更好。
    【解决方案2】:

    这是因为您要求最小和最大 XElement 对象,而框架不知道如何比较 XElements,因为它没有实现 IComparablevar elements 真的等于 IEnumerable&lt;XElement&gt; elements

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

    Yann 的解决方案效率更高,而且会奏效:

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

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 2012-11-14
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多