System


.NET Framework Class Library
IComparable Interface

Defines a generalized comparison method that a value type or class implements to create a type-specific comparison method.

Namespace: System
Assembly: mscorlib (in mscorlib.dll)

Syntax

Visual Basic (Declaration)
<ComVisibleAttribute(True)> _
Public Interface IComparable
Visual Basic (Usage)
Dim instance As IComparable
C#
[ComVisibleAttribute(true)] 
public interface IComparable
C++
[ComVisibleAttribute(true)] 
public interface class IComparable
J#
/** @attribute ComVisibleAttribute(true) */ 
public interface IComparable
JScript
ComVisibleAttribute(true) 
public interface IComparable
Remarks

This interface is implemented by types whose values can be ordered; for example, the numeric and string classes.

A value type or class implements the CompareTo method to create a type-specific comparison method suitable for purposes such as sorting.

Example

The following code sample illustrates the implementation of IComparable and the requisite CompareTo method.

Visual Basic
Public Class Temperature
    Implements IComparable

    Public Overloads Function CompareTo(ByVal obj As Object) As Integer _
        Implements IComparable.CompareTo

        If TypeOf obj Is Temperature Then
            Dim temp As Temperature = CType(obj, Temperature)

            Return m_value.CompareTo(temp.m_value)
        End If

        Throw New ArgumentException("object is not a Temperature")
    End Function

    ' The value holder
    Protected m_value As Integer

    Public Property Value() As Integer
        Get
            Return m_value
        End Get
        Set(ByVal Value As Integer)
            m_value = Value
        End Set
    End Property

    Public Property Celsius() As Integer
        Get
            Return (m_value - 32) / 2
        End Get
        Set(ByVal Value As Integer)
            m_value = Value * 2 + 32
        End Set
    End Property
End Class
C#
public class Temperature : IComparable {
    /// <summary>
    /// IComparable.CompareTo implementation.
    /// </summary>
    public int CompareTo(object obj) {
        if(obj is Temperature) {
            Temperature temp = (Temperature) obj;

            return m_value.CompareTo(temp.m_value);
        }
        
        throw new ArgumentException("object is not a Temperature");    
    }

    // The value holder
    protected int m_value;

    public int Value {
        get {
            return m_value;
        }
        set {
            m_value = value;
        }
    }

    public int Celsius {
        get {
            return (m_value-32)/2;
        }
        set {
            m_value = value*2+32;
        }
    }
}
C++
public ref class Temperature: public IComparable {
   /// <summary>
   /// IComparable.CompareTo implementation.
   /// </summary>
protected:
   // The value holder
   Double m_value;

public:
   virtual Int32 CompareTo( Object^ obj ) {
      if ( obj->GetType() == Temperature::typeid ) {
         Temperature^ temp = dynamic_cast<Temperature^>(obj);

         return m_value.CompareTo( temp->m_value );
      }

      throw gcnew ArgumentException(  "object is not a Temperature" );
   }

   property Double Value {
      Double get() {
         return m_value;
      }
      void set( Double value ) {
         m_value = value;
      }
   }

   property Double Celsius  {
      Double get() {
         return (m_value - 32) / 1.8;
      }
      void set( Double value ) {
         m_value = value * 1.8 + 32;
      }
   }
};
J#
public class Temperature implements IComparable
{
    /// <summary>
    /// IComparable.CompareTo implementation.
    /// </summary>
    public int CompareTo(Object obj)
    {
        if (obj instanceof Temperature) {
            Temperature temp = (Temperature)obj;
            return ((Int32)mValue).CompareTo(temp.mValue);
        }
        throw new ArgumentException("object is not a Temperature");
    } //CompareTo

    // The value holder
    protected int mValue;

    /** @property
     */
    public int get_Value()
    {
        return mValue;
    }//get_Value

    /** @property
     */
    public void set_Value(int value)
    {
        mValue = value;
    }//set_Value

    /** @property
     */
    public int get_Celsius()
    {
        return (mValue - 32) / 2;
    }//get_Celsius

    /** @property 
     */
    public void set_Celsius(int value)
    {
        mValue = value * 2 + 32;
    }//set_Celsius
} //Temperature
Platforms

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see System Requirements.

Version Information

.NET Framework

Supported in: 2.0, 1.1, 1.0

.NET Compact Framework

Supported in: 2.0, 1.0
See Also

Tags :


Community Content

Bill Blancett
C# Source Code and Implementation

// The c# code above is missing the closing brackets } in the code, and doesn't give sample implementation code. Here are both below:

// Temperature class

        public class Temperature: IComparable
{
/// <summary>
/// IComparable.CompareTo implementation
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
#region IComparable Members
            public int CompareTo(object obj)
{
if (obj is Temperature)
{
Temperature temp = (Temperature)obj;
return m_value.CompareTo(temp.m_value);
}
throw new ArgumentException("object is not a Temperature");
}
#endregion
            private int m_value;
            public int Value
{
get { return m_value; }
set { m_value = value; }
}
            public int Celsius
{
get { return (m_value-32)/2; }
set { m_value = (value*2)+32; }
}

}
 

// In your console application include the following instantiation code

    class Program
{
static void Main(string[] args)
{
            Temperature t = new Temperature();
Temperature temp = new Temperature();
t.Value = 50;
temp.Value = 51;
int comparison = t.CompareTo(temp);
if (comparison < 0)
{
Console.WriteLine("t is less than temp.");
}
else if (comparison > 0)
{
Console.WriteLine("t is greater than temp.");
}
else
{
Console.WriteLine("t and temp are equal.");
}
        }
    }
Tags :

billybaloop
woah.
wow, what an awful example.

the key point they're not explaining here is in your CompareTo(object obj), you're supposed to return a negative value if (this) belongs before [obj], a positive number if (this) belongs after [obj], and 0 if you consider (this) and [obj] to be equal.
Tags :

Page view tracker