IStructuralComparable.CompareTo(Object, IComparer) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
현재 컬렉션 개체가 정렬 순서에서 다른 개체의 앞에 오거나, 같은 위치에서 발생하거나, 다른 개체를 따르는지 여부를 결정합니다.
public:
int CompareTo(System::Object ^ other, System::Collections::IComparer ^ comparer);
public int CompareTo(object other, System.Collections.IComparer comparer);
public int CompareTo(object? other, System.Collections.IComparer comparer);
abstract member CompareTo : obj * System.Collections.IComparer -> int
Public Function CompareTo (other As Object, comparer As IComparer) As Integer
매개 변수
- other
- Object
현재 인스턴스와 비교할 개체입니다.
- comparer
- IComparer
현재 컬렉션 개체의 멤버와 해당 멤버를 비교하는 개체입니다 other.
반품
현재 컬렉션 개체 other 와 정렬 순서의 관계를 나타내는 부호 있는 정수입니다.
- 0보다 작으면 현재 인스턴스가 앞에 섰습니다 other.
- 0이면 현재 인스턴스가 동일합니다 other .
- 0보다 크면 현재 인스턴스가 다음과 같습니다 other.
| 반환 값 | 설명 |
|---|---|
| -1 | 현재 인스턴스가 앞에 섰습니다 other.
|
| 0 | 현재 인스턴스이며 other 동일합니다.
|
| 1 | 현재 인스턴스는 다음과 같습니다.other
|
예외
이 인스턴스는 other 동일한 형식이 아닙니다.
예제
다음 예제에서는 1960년부터 2000년까지 미국 3개 도시에 대한 인구 데이터가 포함된 개체 배열 Tuple<T1,T2,T3,T4,T5,T6> 을 만듭니다. sextuple의 첫 번째 구성 요소는 도시 이름입니다. 나머지 5개 구성 요소는 1960년부터 2000년까지 10년 간격으로 모집단을 나타냅니다.
클래스는 PopulationComparer 구성 요소 중 하나를 기준으로 sextuples 배열을 정렬할 수 있는 구현을 제공합니다 IComparer . 생성자의 클래스에는 정렬 순서를 PopulationComparer 정의하는 구성 요소의 위치와 튜플 개체를 오름차순 또는 내림차순으로 Boolean 정렬해야 하는지 여부를 나타내는 값의 두 가지 값이 제공됩니다.
그런 다음 배열의 요소를 정렬되지 않은 순서로 표시하고 세 번째 구성 요소(1970년 모집단)를 기준으로 정렬한 다음, 여섯 번째 구성 요소(2000년 모집단)로 정렬하여 표시합니다. 예제에서는 구현을 IStructuralComparable.CompareTo 직접 호출하지 않습니다. 이 메서드는 배열의 Sort(Array, IComparer) 각 튜플 개체에 대한 메서드에 의해 암시적으로 호출됩니다.
using System;
using System.Collections;
using System.Collections.Generic;
public class PopulationComparer<T1, T2, T3, T4, T5, T6> : IComparer
{
private int itemPosition;
private int multiplier = -1;
public PopulationComparer(int component) : this(component, true)
{ }
public PopulationComparer(int component, bool descending)
{
if (!descending) multiplier = 1;
if (component <= 0 || component > 6)
throw new ArgumentException("The component argument is out of range.");
itemPosition = component;
}
public int Compare(object x, object y)
{
var tX = x as Tuple<T1, T2, T3, T4, T5, T6>;
if (tX == null)
{
return 0;
}
else
{
var tY = y as Tuple<T1, T2, T3, T4, T5, T6>;
switch (itemPosition)
{
case 1:
return Comparer<T1>.Default.Compare(tX.Item1, tY.Item1) * multiplier;
case 2:
return Comparer<T2>.Default.Compare(tX.Item2, tY.Item2) * multiplier;
case 3:
return Comparer<T3>.Default.Compare(tX.Item3, tY.Item3) * multiplier;
case 4:
return Comparer<T4>.Default.Compare(tX.Item4, tY.Item4) * multiplier;
case 5:
return Comparer<T5>.Default.Compare(tX.Item5, tY.Item5) * multiplier;
case 6:
return Comparer<T6>.Default.Compare(tX.Item6, tY.Item6) * multiplier;
default:
return Comparer<T1>.Default.Compare(tX.Item1, tY.Item1) * multiplier;
}
}
}
}
public class Example
{
public static void Main()
{
// Create array of sextuple with population data for three U.S.
// cities, 1960-2000.
Tuple<string, int, int, int, int, int>[] cities =
{ Tuple.Create("Los Angeles", 2479015, 2816061, 2966850, 3485398, 3694820),
Tuple.Create("New York", 7781984, 7894862, 7071639, 7322564, 8008278),
Tuple.Create("Chicago", 3550904, 3366957, 3005072, 2783726, 2896016) };
// Display array in unsorted order.
Console.WriteLine("In unsorted order:");
foreach (var city in cities)
Console.WriteLine(city.ToString());
Console.WriteLine();
Array.Sort(cities, new PopulationComparer<string, int, int, int, int, int>(3));
// Display array in sorted order.
Console.WriteLine("Sorted by population in 1970:");
foreach (var city in cities)
Console.WriteLine(city.ToString());
Console.WriteLine();
Array.Sort(cities, new PopulationComparer<string, int, int, int, int, int>(6));
// Display array in sorted order.
Console.WriteLine("Sorted by population in 2000:");
foreach (var city in cities)
Console.WriteLine(city.ToString());
}
}
// The example displays the following output:
// In unsorted order:
// (Los Angeles, 2479015, 2816061, 2966850, 3485398, 3694820)
// (New York, 7781984, 7894862, 7071639, 7322564, 8008278)
// (Chicago, 3550904, 3366957, 3005072, 2783726, 2896016)
//
// Sorted by population in 1970:
// (New York, 7781984, 7894862, 7071639, 7322564, 8008278)
// (Chicago, 3550904, 3366957, 3005072, 2783726, 2896016)
// (Los Angeles, 2479015, 2816061, 2966850, 3485398, 3694820)
//
// Sorted by population in 2000:
// (New York, 7781984, 7894862, 7071639, 7322564, 8008278)
// (Los Angeles, 2479015, 2816061, 2966850, 3485398, 3694820)
// (Chicago, 3550904, 3366957, 3005072, 2783726, 2896016)
Imports System.Collections
Imports System.Collections.Generic
Public Class PopulationComparer(Of T1, T2, T3, T4, T5, T6) : Implements IComparer
Private itemPosition As Integer
Private multiplier As Integer = -1
Public Sub New(component As Integer)
Me.New(component, True)
End Sub
Public Sub New(component As Integer, descending As Boolean)
If Not descending Then multiplier = 1
If component <= 0 Or component > 6 Then
Throw New ArgumentException("The component argument is out of range.")
End If
itemPosition = component
End Sub
Public Function Compare(x As Object, y As Object) As Integer _
Implements IComparer.Compare
Dim tX = TryCast(x, Tuple(Of T1, T2, T3, T4, T5, T6))
If tX Is Nothing Then
Return 0
Else
Dim tY = DirectCast(y, Tuple(Of T1, T2, T3, T4, T5, T6))
Select Case itemPosition
Case 1
Return Comparer(Of T1).Default.Compare(tX.Item1, tY.Item1) * multiplier
Case 2
Return Comparer(Of T2).Default.Compare(tX.Item2, tY.Item2) * multiplier
Case 3
Return Comparer(Of T3).Default.Compare(tX.Item3, tY.Item3) * multiplier
Case 4
Return Comparer(Of T4).Default.Compare(tX.Item4, tY.Item4) * multiplier
Case 5
Return Comparer(Of T5).Default.Compare(tX.Item5, tY.Item5) * multiplier
Case 6
Return Comparer(Of T6).Default.Compare(tX.Item6, tY.Item6) * multiplier
' This should never happen.
Case Else
Return 0
End Select
End If
End Function
End Class
Module Example
Public Sub Main()
' Create array of sextuple with population data for three U.S.
' cities, 1960-2000.
Dim cities() =
{ Tuple.Create("Los Angeles", 2479015, 2816061, 2966850, 3485398, 3694820),
Tuple.Create("New York", 7781984, 7894862, 7071639, 7322564, 8008278),
Tuple.Create("Chicago", 3550904, 3366957, 3005072, 2783726, 2896016) }
' Display array in unsorted order.
Console.WriteLine("In unsorted order:")
For Each city In cities
Console.WriteLine(city.ToString())
Next
Console.WriteLine()
Array.Sort(cities, New PopulationComparer(Of String, Integer, Integer, Integer, Integer, Integer)(3))
' Display array in sorted order.
Console.WriteLine("Sorted by population in 1970:")
For Each city In cities
Console.WriteLine(city.ToString())
Next
Console.WriteLine()
Array.Sort(cities, New PopulationComparer(Of String, Integer, Integer, Integer, Integer, Integer)(6))
' Display array in sorted order.
Console.WriteLine("Sorted by population in 2000:")
For Each city In cities
Console.WriteLine(city.ToString())
Next
End Sub
End Module
' The example displays the following output:
' In unsorted order:
' (Los Angeles, 2479015, 2816061, 2966850, 3485398, 3694820)
' (New York, 7781984, 7894862, 7071639, 7322564, 8008278)
' (Chicago, 3550904, 3366957, 3005072, 2783726, 2896016)
'
' Sorted by population in 1970:
' (New York, 7781984, 7894862, 7071639, 7322564, 8008278)
' (Chicago, 3550904, 3366957, 3005072, 2783726, 2896016)
' (Los Angeles, 2479015, 2816061, 2966850, 3485398, 3694820)
'
' Sorted by population in 2000:
' (New York, 7781984, 7894862, 7071639, 7322564, 8008278)
' (Los Angeles, 2479015, 2816061, 2966850, 3485398, 3694820)
' (Chicago, 3550904, 3366957, 3005072, 2783726, 2896016)
설명
이 메서드는 CompareTo 배열 및 튜플 개체의 사용자 지정 구조 비교 및 정렬을 지원합니다. 메서드는 CompareTo 개체의 comparer 메서드를 IComparer.Compare 호출하여 첫 번째 요소 또는 구성 요소부터 시작하여 개별 배열 요소 또는 튜플 구성 요소를 비교합니다. 다음에 대한 IComparer.Compare 개별 호출과 메서드는 CompareTo 다음 조건 중 하나가 true가 되면 값을 반환합니다.
메서드는 IComparer.Compare -1을 반환합니다.
메서드는 IComparer.Compare 1을 반환합니다.
컬렉션 IComparer.Compare 개체의 마지막 요소 또는 구성 요소에 대해 메서드가 호출됩니다.