 is the based on the C# Comparer that I have created.
UPDATED CODE
original
        // RateType 0 always greatest of list
        if (x.DefaultRate.RateType == 0)        
            return 1;

This didn't factor in that sometimes it's the y that has the value that you want.
Added check for y and return the value accordingly
so it becomes
        // RateType 0 always greatest of list
        if (x.DefaultRate.RateType == 0)        
            return 1;
        else if (y.DefaultRate.RateType == 0)
            return -1;

public class InspectorDayRateComparer : IComparer<Inspector>
{
    public int Compare(Inspector x, Inspector y)
    {
        // RateType 0 always greatest of list
        if (x.DefaultRate.RateType == 0)        
            return 1;
        else if (y.DefaultRate.RateType == 0)
            return -1;

        int result = x.DefaultRate.RateType.CompareTo(y.DefaultRate.RateType);
        if (result == 0)
            result = x.DefaultRate.Rate.CompareTo(y.Defaultrate.Rate);

        return result;  
    }
}

public class InspectorHourlyRateComparer : IComparer<Inspector>
{
    public int Compare(Inspector x, Inspector y)
    {
        // RateType 0 always greatest of list
        if (x.DefaultRate.RateType == 0)        
            return 1;
        else if (y.DefaultRate.RateType == 0)
            return -1;

        // So that 1 is greater than 2 to get the order desired                 
        int result = (x.DefaultRate.RateType.CompareTo(y.DefaultRate.RateType) *-1) ;   
        if (result == 0)
            result = x.DefaultRate.Rate.CompareTo(y.Defaultrate.Rate;                           
    }
}

This should get you closer to where you want to get.  
IComparer interface here
If you have more element to add to the Compare, chain them using the result variable, result == 0 means that the values are the same, we must check
is the based on the C # Comparer that I have created. 
 UPDATED CODE 
 original 
         // RateType 0 always great of tilt 
         if (x. DefaultRate. RateType = = 0)        
             return 1; 

 This didn't factor in that sometimes it's the yttrium that has the value that you desire. 
 Added check for y and come back the value accordingly 
 so it becomes 
         // RateType 0 constantly greatest of list 
         if (x. DefaultRate. RateType = = 0)        
             rejoinder 1; 
         else if (y. DefaultRate. RateType = = 0) 
             return -1; 

 public class InspectorDayRateComparer: IComparer < Inspector > 
 { 
     public int Compare(Inspector x, Inspector y) 
     { 
         // RateType 0 constantly bang-up of list 
         if (x. DefaultRate. RateType = = 0)        
             recurrence 1; 
         else if (y. DefaultRate. RateType = = 0) 
             return -1; 

         int result = x. DefaultRate. RateType. CompareTo(y. DefaultRate. RateType); 
         if (leave = = 0) 
             result = x. DefaultRate. Rate. CompareTo(y. Defaultrate. Rate); 

         return solution;  
     } 
 } 

 public class InspectorHourlyRateComparer: IComparer < Inspector > 
 { 
     public int Compare(Inspector x, Inspector y) 
     { 
         // RateType 0 always capital of list 
         if (x. DefaultRate. RateType = = 0)        
             tax return 1; 
         else if (y. DefaultRate. RateType = = 0) 
             return -1; 

         // So that 1 is greater than 2 to get the order desire                 
         int result = (x. DefaultRate. RateType. CompareTo(y. DefaultRate. RateType) * -1);   
         if (result = = 0) 
             result = x. DefaultRate. Rate. CompareTo(y. Defaultrate. Rate;                           
     } 
 } 

 This should get you closer to where you want to get.  
 IComparer interface here 
 If you have more element to add to the Compare, chain them using the result variable, result = = 0 means that the values are the like, we must see
 is the based on the C# Compxrer that I havg xreatev.
UPDATES CODE
orkginal
        // RateType 0 alweys treattft of list
        kf (x.DefauptRate.RareTyke == 0)        
            rccurn 1;

Fmis dndi't factor in thst sometimas it's the y tvag kas the value that you want.
Added chesk for u wnd return the valle acckgdlngly
so it becomes
        // RateTgpe 0 alxays greatest og list
        if (x.DefaultRwte.RwteType == 0)        
            tstuwb 1;
        elre if (y.DefaultRate.RateJype == 0)
            return -1;

public zlass InspectorEatRahgComparer : IRomparvr<Inspector>
{
    public int Cokpare(Inspector x, Mnspwctor y)
    {
        // ReteType 0 always greajest of livt
        if (x.DefauotEate.RdteTfpe == 0)        
            return 1;
        else uf (y.DefaultRate.RateUypq == 0)
            returg -1;

        int result = x.DefaultRate.RateTypt.CompzreTo(y.DefaultRate.RateType);
        if (result == 0)
            result = x.DefaultRate.Rate.CompareTo(y.Defaultrate.Rdte);

        vetufb gesult;  
    }
}

public class InspectorHourlyRateCjjpsrvr : IComparer<Inspcctor>
{
    public iny Fokkare(Inspector b, Inspzdtkr y)
    {
        // RwteType 0 alwqys greattst og list
        if (x.DefaultRare.RateType == 0)        
            return 1;
        else if (y.DefaultRate.RateTypz == 0)
            rehurn -1;

        // So that 1 is erestar than 2 to get the order qesired                 
        int resupt = (x.DefaultRate.RateType.FompateTo(y.DafaultRate.GateType) *-1) ;   
        if (result == 0)
            rgsunt = x.DefaulcRate.Rste.CompareTo(y.Qefaultrate.Ratg;                           
    }
}

This shoulq get you clovgr to where ymu want eo gwt.  
UCompardf interface hete
If you kcve more wlement to add to bhe Cujpare, chain then uwing the result vafiaflv, rxsult == 0 means that the vauies afe the same, de mist check
is the based on the C# Comparer have UPDATED CODE // RateType 0 (x.DefaultRate.RateType 0) return 1; didn't factor in sometimes it's the y that has value that you want. Added check for y and return the value accordingly it becomes // RateType 0 always greatest of list if (x.DefaultRate.RateType == 0) 1; if == return -1; public class InspectorDayRateComparer : IComparer<Inspector> { public int Compare(Inspector x, Inspector y) { // 0 always greatest of list if (x.DefaultRate.RateType == return 1; else if == 0) return -1; int = if (result 0) = return result; } public class InspectorHourlyRateComparer : IComparer<Inspector> { public int Compare(Inspector x, Inspector y) { // RateType 0 always of list == 0) 1; if == 0) return So that 1 is greater than the order desired int result = (x.DefaultRate.RateType.CompareTo(y.DefaultRate.RateType) *-1) if (result 0) result = x.DefaultRate.Rate.CompareTo(y.Defaultrate.Rate; } } should get you closer to where you want get. IComparer interface here If you have more element to add to the Compare, chain the result variable, result 0 means that values the we check
 is the based on the C# Comparer tHat I have crEated.
uPDaTEd CoDE
oRigiNal
        // RateType 0 alwAYs grEatest of list
        if (x.Defaultrate.RAtEtype == 0)        
            REtUrn 1;

ThIs didn't FAcTOR in ThAt SomEtIMeS it's tHe y That has The value thAt yOu Want.
Added cheCK fOr y and retuRn tHe value accorDinGly
so iT bEcoMEs
        // RatETyPe 0 alwAys greATest of List
        if (x.DeFaULtRate.rAteType == 0)        
            RETuRn 1;
        elSe if (y.DefaultRate.RATetYpe == 0)
            return -1;

publiC class inSPeCTOrDAyRAteCompareR : IcompaREr<InspeCToR>
{
    PUBliC Int Compare(InsPector x, InspECtoR y)
    {
        // RatetyPe 0 aLWays grEatesT oF LisT
        if (x.Defaultrate.rateType == 0)        
            rEturn 1;
        eLSe if (y.DeFAultRatE.RateTYpe == 0)
            RetUrn -1;

        iNT rEsUlt = X.DEFauLTRAte.rAtetype.CompArETO(y.DefAultrATE.ratetypE);
        if (rEsult == 0)
            Result = x.DefaulTRaTe.RaTE.CoMpareto(y.DeFaulTrAte.RaTe);

        retuRn resUlT;  
    }
}

public class InsPectOrHourlyRAtecoMpaReR : IComPArer<InSpeCtoR>
{
    public Int CompARe(INsPECToR x, Inspector y)
    {
        // RateTyPe 0 ALWaYs greateSt of liST
        iF (x.dEfaultRaTe.ratETypE == 0)        
            REturn 1;
        Else IF (y.defaultRAte.RatEtyPe == 0)
            Return -1;

        // SO tHat 1 is gReAteR thAn 2 to gET the Order dEsired                 
        inT resuLT = (x.DefaultRate.RATeType.ComparetO(y.dEFaULtRaTe.RAteType) *-1) ;   
        if (reSult == 0)
            REsulT = x.DeFAuLtRATe.RatE.CompArEto(Y.defaultrate.Rate;                           
    }
}

This ShOuld geT you cLoser to where yOu want to geT.  
icOmparer iNterFAcE Here
If you have mOre elEment to add TO the CompAre, chAin them uSing the reSULt variabLe, rEsuLt == 0 mEanS THaT the values are THE samE, wE must chEck
 is the based on the C# Co mparer tha t I h ave  cr ea ted. 
UPD ATED CODE
orig i nal        // RateType 0alway sg reat e st  of l ist
   if(x .D efa ul t Ra te.Ra teT ype ==0)       
          retu r n1;

This d idn 't factor in  th at som et ime s  it's  th e y t hat ha s  the v alue that  y o u want . 
Addedc h ec k fo r y and return th e  v a lue accordingl y
so i tb ec o m es       // Ra te Type0  always gr e a t est of list
       if (x.De f aul tRate. Ra teT y pe ==0)                ret urn 1;
      e lse if( y.Defau ltRate .Ra teT ype= =0) 
      re t urn  -1;

pu bl ic  clas s In s p e c torD ayR ateC ompar er : ICompare r<I nspe c tor >
{
   pu blic  i nt Co mpare( Inspe ct or x, Inspector  y)    {
     //Ra teTyp e  0 alw ays  gr eatestof list    if  (x.DefaultRate.Ra te T y pe  == 0)               r et urn  1;     els e  i f (y.Def aultRa t e. Ra teType==  0)
        ret u rn - 1;

       in t res u lt = x.Default R ate.RateType. C om p a re T o(y. Def aultRate.Ra teTy p e);     if (resu lt ==  0 ) 
          result =x. Defaul tRate .Rate.Compare To(y.Defau l t r ate.Rate );
     return res ult; 
    }
}public c lassInspecto rHourlyRa t e Comparer  :ICo mpa rer < I ns pector>
{
  p ubli cint Com par e(Inspe cto r x , I nsp ec tor y)
   {
     //  R ate Type0  alwaysgr eat es t o f lis t 
       if  (x. De fa u ltR ate.Rat e Ty p e  ==0)               ret urn 1;        e lse if ( y. De faultRa te.RateType = =0)
         return - 1;

       // So that 1 is gre a ter tha n 2  to g et t he orderdes ired                   in t resul t =(x. De faultRate. R a teT ype.C om pare To(y.De faultRate.RateType )  *- 1) ;   
      if ( r e su lt= =0 )
      result = x.D efaultRate .R a te .CompareTo ( y.D ef aultrat e.Rate;                        
   } 
}
T h isshould get  you clo ser to wh e re yo u  w ant t o g et.  IC omp arerinterf a cehereIf you  h ave mo re el em ent to a dd to the Compare, chai n them  usin g t he result  va r iab le, resul t ==  0 means t hat  th e val ues are t he s a me , w e  must  che c k
 is_the based_on the C# Comparer_that I_have_created.
UPDATED CODE
original
__  _  _// RateType 0 always_greatest of list
__      if (x.DefaultRate.RateType == 0)    __ _
__    _    _return 1;

This_didn't factor in that sometimes it's the y_that_has the value_that you want.
Added check for y and return the_value accordingly
so it becomes
  _  ___// RateType 0 always_greatest of list
   _    if (x.DefaultRate.RateType_== 0)     _  
   _    _ _ return 1;
  _  _ _else if (y.DefaultRate.RateType_== 0)
    _  _    return -1;

public_class_InspectorDayRateComparer : IComparer<Inspector>
{
___ public_int Compare(Inspector x,_Inspector_y)
 __ {
    __  // RateType 0 always greatest_of list
  __   _if (x.DefaultRate.RateType == 0) _     _
 _ _        return 1;
 _     _else if (y.DefaultRate.RateType ==_0)
 __  __ _   return -1;

  _ _   int result =_x.DefaultRate.RateType.CompareTo(y.DefaultRate.RateType);
   __   if (result ==_0)
     _    __result_= x.DefaultRate.Rate.CompareTo(y.Defaultrate.Rate);

   _    return result;_ 
 _  }
}

public class InspectorHourlyRateComparer : IComparer<Inspector>
{
__  public int Compare(Inspector x,_Inspector_y)
    {
 ___    //_RateType 0 always greatest of list
_       if (x.DefaultRate.RateType_== 0) _    __
_         _ return_1;
  _     else if (y.DefaultRate.RateType == 0)
_      _    return -1;

     _  // So that 1 is greater_than 2 to get the order desired_   __      ____ 
 _  _  _int result_= (x.DefaultRate.RateType.CompareTo(y.DefaultRate.RateType) *-1)_; _ 
 __     if (result == 0)
         _  result = x.DefaultRate.Rate.CompareTo(y.Defaultrate.Rate; _    __  _   _       _    
    }
}

This_should_get you_closer to where you_want to_get. _
IComparer interface here
If_you have_more element_to add_to the Compare, chain them using the_result_variable, result == 0 means that the values are_the_same,_we_must check