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
は、このインスタンスと同じ型ではありません。
例
次の例は、CompareTo を使用して、IComparable を実装する Temperature
オブジェクトを別のオブジェクトと比較する方法を示しています。
Temperature
オブジェクトは、Int32.CompareTo メソッドの呼び出しをラップするだけで、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
より大きい (または次の) null
を比較し、2 つの null 参照が互いに等しく比較されます。
パラメーター obj
は、このインターフェイスを実装するクラスまたは値型と同じ型である必要があります。それ以外の場合は、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) メソッドを使用します。
適用対象
こちらもご覧ください
.NET