# IComparable 인터페이스

## 정의

값 형식 또는 클래스에서 해당 인스턴스를 정렬 및 순서 지정하기 위해 구현하는 일반화된 형식별 비교 메서드를 정의합니다.

``public interface class IComparable``
``public interface IComparable``
``````[System.Runtime.InteropServices.ComVisible(true)]
public interface IComparable``````
``type IComparable = interface``
``````[<System.Runtime.InteropServices.ComVisible(true)>]
type IComparable = interface``````
``Public Interface IComparable``
파생
특성

## 예제

다음 예제 구현의 IComparable 필수 CompareTo 메서드.

``````using namespace System;
using namespace System::Collections;

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 == nullptr) return 1;

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;
}
}
};

int main()
{
ArrayList^ temperatures = gcnew ArrayList;
// Initialize random number generator.
Random^ rnd = gcnew Random;

// Generate 10 temperatures between 0 and 100 randomly.
for (int ctr = 1; ctr <= 10; ctr++)
{
int degrees = rnd->Next(0, 100);
Temperature^ temp = gcnew Temperature;
temp->Value = degrees;
}

// Sort ArrayList.
temperatures->Sort();

for each (Temperature^ temp in temperatures)
Console::WriteLine(temp->Value);
return 0;
}
// The example displays the following output to the console (individual
// values may vary because they are randomly generated):
//       2
//       7
//       16
//       17
//       31
//       37
//       58
//       66
//       72
//       95
``````
``````using System;
using System.Collections;

public class Temperature : IComparable
{
// The temperature value
protected double temperatureF;

public int CompareTo(object obj) {
if (obj == null) return 1;

Temperature otherTemperature = obj as Temperature;
if (otherTemperature != null)
return this.temperatureF.CompareTo(otherTemperature.temperatureF);
else
throw new ArgumentException("Object is not a Temperature");
}

public double Fahrenheit
{
get
{
return this.temperatureF;
}
set
{
this.temperatureF = value;
}
}

public double Celsius
{
get
{
return (this.temperatureF - 32) * (5.0/9);
}
set
{
this.temperatureF = (value * 9.0/5) + 32;
}
}
}

public class CompareTemperatures
{
public static void Main()
{
ArrayList temperatures = new ArrayList();
// Initialize random number generator.
Random rnd = new Random();

// Generate 10 temperatures between 0 and 100 randomly.
for (int ctr = 1; ctr <= 10; ctr++)
{
int degrees = rnd.Next(0, 100);
Temperature temp = new Temperature();
temp.Fahrenheit = degrees;
}

// Sort ArrayList.
temperatures.Sort();

foreach (Temperature temp in temperatures)
Console.WriteLine(temp.Fahrenheit);
}
}
// The example displays the following output to the console (individual
// values may vary because they are randomly generated):
//       2
//       7
//       16
//       17
//       31
//       37
//       58
//       66
//       72
//       95
``````
``````open System
open System.Collections

type Temperature() =
// The temperature value
let mutable temperatureF = 0.

interface IComparable with
member _.CompareTo(obj) =
match obj with
| null -> 1
| :? Temperature as other ->
temperatureF.CompareTo other.Fahrenheit
| _ ->
invalidArg (nameof obj) "Object is not a Temperature"

member _.Fahrenheit
with get () =
temperatureF
and set (value) =
temperatureF <- value

member _.Celsius
with get () =
(temperatureF - 32.) * (5. / 9.)
and set (value) =
temperatureF <- (value * 9. / 5.) + 32.

let temperatures = ResizeArray()

// Initialize random number generator.
let rnd = Random()

// Generate 10 temperatures between 0 and 100 randomly.
for _ = 1 to 10 do
let degrees = rnd.Next(0, 100)
let temp = Temperature(Fahrenheit=degrees)

// Sort ResizeArray.
temperatures.Sort()

for temp in temperatures do
printfn \$"{temp.Fahrenheit}"

// The example displays the following output to the console (individual
// values may vary because they are randomly generated):
//       2
//       7
//       16
//       17
//       31
//       37
//       58
//       66
//       72
//       95
``````
``````Imports System.Collections

Public Class Temperature
Implements IComparable
' The temperature value
Protected temperatureF As Double

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

If obj Is Nothing Then Return 1

Dim otherTemperature As Temperature = TryCast(obj, Temperature)
If otherTemperature IsNot Nothing Then
Return Me.temperatureF.CompareTo(otherTemperature.temperatureF)
Else
Throw New ArgumentException("Object is not a Temperature")
End If
End Function

Public Property Fahrenheit() As Double
Get
Return temperatureF
End Get
Set(ByVal Value As Double)
Me.temperatureF = Value
End Set
End Property

Public Property Celsius() As Double
Get
Return (temperatureF - 32) * (5/9)
End Get
Set(ByVal Value As Double)
Me.temperatureF = (Value * 9/5) + 32
End Set
End Property
End Class

Public Module CompareTemperatures
Public Sub Main()
Dim temperatures As New ArrayList
' Initialize random number generator.
Dim rnd As New Random()

' Generate 10 temperatures between 0 and 100 randomly.
For ctr As Integer = 1 To 10
Dim degrees As Integer = rnd.Next(0, 100)
Dim temp As New Temperature
temp.Fahrenheit = degrees
Next

' Sort ArrayList.
temperatures.Sort()

For Each temp As Temperature In temperatures
Console.WriteLine(temp.Fahrenheit)
Next
End Sub
End Module
' The example displays the following output to the console (individual
' values may vary because they are randomly generated):
'       2
'       7
'       16
'       17
'       31
'       37
'       58
'       66
'       72
'       95
``````

## 설명

이 인터페이스는 해당 값을 정렬 하거나 정렬할 수 형식에서 구현 됩니다. 구현 형식 단일 메서드를 정의 하는 것이 필요할 CompareTo(Object), 하는 정렬 순서에서 현재 인스턴스의 위치 인지 나타내는 이전 후 동일한 형식의 두 번째 개체와 동일 합니다. 인스턴스의 IComparable 구현을 라고 자동으로 메서드에서 같은 Array.SortArrayList.Sort입니다.

구현의 합니다 CompareTo(Object) 메서드를 반환 해야 합니다는 Int32 있는 세 가지 값 중 하나는 다음 표에 나와 있는 것 처럼 합니다.

의미
0보다 작음 현재 인스턴스가 지정한 개체 앞에 CompareTo 정렬 순서에서 메서드.
0 이 현재 인스턴스에 지정 된 개체와 정렬 순서에서 같은 위치에서 발생 된 CompareTo 메서드.
0보다 큼 이 현재 인스턴스에 의해 지정 된 개체 다음에 오는 여 CompareTo 정렬 순서에서 메서드.

모든 숫자 형식 (같은 Int32 하 고 Double) 구현 IComparable같이 StringChar, 및 DateTime합니다. 사용자 지정 형식의 자체 구현을 제공 해야 IComparable 정렬 되거나 정렬 될 개체 인스턴스를 사용 하도록 설정 합니다.

## 메서드

 현재 인스턴스와 동일한 형식의 다른 개체를 비교하고 정렬 순서에서 현재 인스턴스의 위치가 다른 개체보다 앞인지, 뒤인지 또는 동일한지를 나타내는 정수를 반환합니다.