Actualización:
Julio de 2008
Define un método de comparación de tipo específico, implementado por un tipo de valor o clase con el fin de ordenar sus instancias.
Espacio de nombres:
System
Ensamblado:
mscorlib (en mscorlib.dll)
Visual Basic (Declaración)
<ComVisibleAttribute(True)> _
Public Interface IComparable
Dim instance As IComparable
[ComVisibleAttribute(true)]
public interface IComparable
[ComVisibleAttribute(true)]
public interface class IComparable
/** @attribute ComVisibleAttribute(true) */
public interface IComparable
public interface IComparable
Esta interfaz se implementa mediante tipos cuyos valores se pueden ordenar. Requiere que al implementar los tipos, se defina un método único, CompareTo, que indica si la posición de la instancia actual en el criterio de ordenación es anterior, posterior o igual a un segundo objeto del mismo tipo. Métodos como Array..::.Sort y ArrayList..::.Sort llaman automáticamente a la implementación IComparable de la instancia.
Todos los tipos numéricos (como Int32 y Double) implementan IComparable, al igual que String, Char y DateTime. Los tipos personalizados deben proporcionar también su propia implementación de IComparable para permitir ordenar las instancias de objetos.
En el siguiente ejemplo de código se muestra el uso de IComparable y el método CompareTo necesario.
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 TypeOf obj Is Temperature Then
Dim otherTemperature As Temperature = DirectCast(obj, Temperature)
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
temperatures.Add(temp)
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
using System;
using System.Collections;
public class Temperature : IComparable
{
// The temperature value
protected double temperatureF;
public int CompareTo(object obj) {
if(obj is Temperature)
{
Temperature otherTemperature = (Temperature) obj;
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/9);
}
set
{
this.temperatureF = (value * 9/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;
temperatures.Add(temp);
}
// 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
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->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;
temperatures->Add(temp);
}
// 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
Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile para Smartphone, Windows Mobile para Pocket PC, Xbox 360
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
.NET Framework
Compatible con: 3.5, 3.0, 2.0, 1.1, 1.0
.NET Compact Framework
Compatible con: 3.5, 2.0, 1.0
XNA Framework
Compatible con: 2.0, 1.0
Referencia
Fecha
|
Historial
|
Motivo
|
|---|
Julio de 2008
|
Se ha agregado información detallada sobre el uso por parte de Common Language Runtime e información para los implementadores.
|
Comentarios de los clientes.
|