IComparable.CompareTo(Object) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
現在のインスタンスを同じ型の別のオブジェクトと比較し、現在のインスタンスの並べ替え順序での位置が、比較対象のオブジェクトと比べて前か、後か、または同じかを示す整数を返します。
public:
int CompareTo(System::Object ^ obj);
public int CompareTo (object obj);
public int CompareTo (object? obj);
abstract member CompareTo : obj -> int
Public Function CompareTo (obj As Object) As Integer
パラメーター
- obj
- Object
このインスタンスと比較するオブジェクト。
戻り値
比較対象オブジェクトの相対順序を示す値。 戻り値の意味は次のとおりです。
[値] | 説明 |
---|---|
0 より小さい値 | このインスタンスの位置が、並べ替え順序において obj よりも前です。
|
ゼロ | 並べ替え順序における、このインスタンスと obj の位置が同じです。
|
0 より大きい値 | このインスタンスの位置が、並べ替え順序において obj よりも後ろです。
|
例外
obj
の型がこのインスタンスの型と異なります。
例
次の例では、実装IComparableされているオブジェクトを別のCompareToオブジェクトと比較Temperature
する方法を示します。 オブジェクトは Temperature
、メソッドの CompareTo 呼び出し Int32.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;
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
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;
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
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)
temperatures.Add temp
// 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
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
注釈
このメソッドは CompareTo 、値を並べ替えたり並べ替えたりできる型によって実装されます。 これは、配列の各メンバーを並べ替えるために、 Array.Sort非ジェネリック コレクション オブジェクトのメソッドによって自動的に呼び出されます。 カスタム クラスまたは構造体が実装 IComparableされていない場合、そのメンバーを順序付けできず、並べ替え操作で InvalidOperationException.
このメソッドは定義のみで、効果を得るために特定のクラスまたは値型によって実装する必要があります。 戻り値セクション ("前"、"と同じ位置で発生する"、および "フォローする") で指定された比較の意味は、特定の実装によって異なります。
定義上、どのオブジェクトもより大きい (または次の値) null
比較し、2 つの null 参照が互いに等しく比較されます。
パラメーターは、 obj
このインターフェイスを実装するクラスまたは値型と同じ型である必要があります。それ以外の場合は、an ArgumentException がスローされます。
注意 (実装者)
オブジェクト A、B、C の場合、次の条件が満たされている必要があります。
A.CompareTo(A) は
0 を返す必要があります。
A.CompareTo(B) が
0 を返す場合、B.CompareTo(A)
は 0 を返す必要があります。
A.CompareTo(B) が
0 を返し、B.CompareTo(C)
が 0 を返す場合、A.CompareTo(C)
は 0 を返す必要があります。
A.CompareTo(B) が
0 以外の値を返す場合、B.CompareTo(A)
は逆符号の値を返す必要があります。
A.CompareTo(B) が
0 以外の値x
を返し、B.CompareTo(C) が
同じ符号x
の値y
を返す場合は、A.CompareTo(C)
と同じ符号x
y
の値を返す必要があります。
注意 (呼び出し元)
このメソッドを CompareTo(Object) 使用して、クラスのインスタンスの順序を決定します。