使用Linq .Min() - 至少有一个对象必须实现IComparable

时间:2014-03-01 16:47:40

标签: c# linq min

我想获得集合中最小的值,我正在使用LINQ来执行此操作。我在线阅读我可以使用Min(),但我收到错误消息:

 At least one object must implement IComparable

这是我的代码

public virtual void GetBestValue(ModelEnergyCalculator ModelEnergyCalculator)
{
     ModelTariffQuote ModelTariffQuote = (from q in ModelEnergyCalculator.ModelTariffQuotes   
                                                  select q).Min();                     
}

这是我的收藏

    -       -       ModelEnergyCalculator   {EnergyHelpline.Model.ModelEnergyCalculator}    EnergyHelpline.Model.ModelEnergyCalculator
-       ModelTariffQuotes   Count = 4   System.Collections.Generic.List<EnergyHelpline.Model.ModelTariffQuote>
-       [0] {EnergyHelpline.Model.ModelTariffQuote} EnergyHelpline.Model.ModelTariffQuote
        ElectricityUsage    0   decimal
        FinalElectricityCost    179.97655091937073972602739726  decimal
        FinalGasCost    112.48534432460671232876712328  decimal
        GasUsage    0   decimal
        InitialElectricityCost  30.0117245403146958904109589    decimal
        InitialGasCost  18.757327837696684931506849312  decimal
+       QuoteIssuedDate {01/01/0001 00:00:00}   System.DateTime
        TariffName  null    string
        TotalCalculatedCost 341.23094762198883287671232875  decimal
+       [1] {EnergyHelpline.Model.ModelTariffQuote} EnergyHelpline.Model.ModelTariffQuote
+       [2] {EnergyHelpline.Model.ModelTariffQuote} EnergyHelpline.Model.ModelTariffQuote
+       [3] {EnergyHelpline.Model.ModelTariffQuote} EnergyHelpline.Model.ModelTariffQuote
+       Raw View        
+       ModelTariffs    Count = 4   System.Collections.Generic.List<EnergyHelpline.Model.ModelTariff>

如何解决此错误或是否有更好的方法来获取最小值?

4 个答案:

答案 0 :(得分:2)

比使用IComparable更简单,更灵活的方法是根据需要订购对象并选择第一个。如果您需要最高,那么您只需要使用OrderByDescending。

var lowest = ModelEnergyCalculator.ModelTariffQuotes
    .OrderBy(m => m.GasFinalRate)
    .FirstOrDefault();

答案 1 :(得分:0)

您应该告诉编译器如何通过为您的类实现IComparable<T>接口来比较您的对象。如果您想要属性或字段的最小值,您可以在查询中指定它,如下所示:

ModelEnergyCalculator.ModelTariffQuotes.Select(q => q.GasFinalRate).Min();

或者您可以使用Min的重载版本:

ModelEnergyCalculator.ModelTariffQuotes.Min(q => q.GasFinalRate);

答案 2 :(得分:0)

要对复杂值的集合使用.Min(),必须实现IComparable接口,并指定对象x如何大于或等于对象y。否则,c#无法知道如何比较您的值。

或者您可以使用此yourCollection.Select(x => x.ThePropertyIWantToUseToCompare).Min()将返回集合中所有项目中最小的ThePropertyIWantToUseToCompare值。

答案 3 :(得分:0)

计算机不知道如何将ModelTariffQuote与另一个ModelTariffQuote进行比较。所以找不到最小的对象。您必须通过在ModelTariffQuote类上实现IComparable接口来定义此比较。您还可以实现通用IComparable<T>接口。