IStructuralComparable 인터페이스

정의

컬렉션 개체의 구조적 비교를 지원합니다.Supports the structural comparison of collection objects.

public interface class IStructuralComparable
public interface IStructuralComparable
type IStructuralComparable = interface
Public Interface IStructuralComparable
파생

예제

다음 예제에서는 1960 ~ 2000에서 3 개의 미국 도시에 대 한 인구 데이터를 포함 하는 Tuple<T1,T2,T3,T4,T5,T6> 개체의 배열을 만듭니다.The following example creates an array of Tuple<T1,T2,T3,T4,T5,T6> objects that contains population data for three U.S. cities from 1960 to 2000. 6 중의 첫 번째 구성 요소에는 도시 이름입니다.The sextuple's first component is the city name. 나머지 5 개의 구성 요소를 2000 1960 년부터 10 년 간격 인구를 나타냅니다.The remaining five components represent the population at ten-year intervals from 1960 to 2000.

PopulationComparer 클래스는 해당 구성 요소 중 하나를 기준으로 sextuples 배열을 정렬할 수 있도록 하는 IComparer 구현을 제공 합니다.The PopulationComparer class provides an IComparer implementation that allows the array of sextuples to be sorted by any one of its components. 해당 생성자에서 PopulationComparer 클래스에 두 값이 제공 됩니다. 정렬 순서를 정의 하는 구성 요소의 위치와 튜플 개체를 오름차순으로 정렬할지 아니면 내림차순으로 정렬할지를 나타내는 부울 값입니다.Two values are provided to the PopulationComparer class in its constructor: the position of the component that defines the sort order, and a Boolean value that indicates whether the tuple objects should be sorted in ascending or descending order.

예제에서는 다음 정렬 되지 않은 순서로 배열에 요소를 표시, 세 번째 구성 요소 (1970에서 채우기)을 기준으로 정렬 및 표시 하 다음 여섯 번째 구성 요소 (2000에서 채우기)을 기준으로 정렬 및 표시 합니다.The example then displays the elements in the array in unsorted order, sorts them by the third component (the population in 1970) and displays them, and then sorts them by the sixth component (the population in 2000) and displays them. 예제에서는 CompareTo 메서드를 직접 호출 하지 않습니다.Note that the example does not directly call the CompareTo method. 메서드는 배열의 각 튜플 개체에 대 한 Sort(Array, IComparer) 메서드에서 암시적으로 호출 됩니다.The method is called implicitly by the Sort(Array, IComparer) method for each tuple object in the array.

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)

설명

IStructuralComparable 인터페이스를 사용 하 여 컬렉션 멤버에 대 한 사용자 지정 비교를 구현할 수 있습니다.The IStructuralComparable interface enables you to implement customized comparisons for collection members. 즉, 정확 하 게 말해 앞, 뒤 또는 두 번째 컬렉션 개체와 정렬 순서에서 같은 위치에서 발생 한 컬렉션 개체에 대 한을 정의할 수 있습니다.That is, you can define precisely what it means for one collection object to precede, follow, or occur in the same position in the sort order as a second collection object. 그런 다음 IStructuralComparable 인터페이스를 허용 하는 컬렉션 형식에이 정의를 사용 하도록 지정할 수 있습니다.You can then specify that this definition be used with a collection type that accepts the IStructuralComparable interface.

인터페이스에는 현재 컬렉션 개체가 정렬 순서에서 두 번째 개체 보다 작거나 같은지 또는 큰지를 결정 하는 단일 멤버 CompareTo있습니다.The interface has a single member, CompareTo, which determines whether the current collection object is less than, equal to, or greater than a second object in the sort order. 현재 인스턴스의 멤버 또는 요소와 두 번째 개체의 요소에 대 한 실제 비교는 사용자 지정 비교의 정의가 포함 된 IComparer 인터페이스 구현에 의해 수행 됩니다.The actual comparison of the members or elements in the current instance with those in a second object is performed by an IComparer interface implementation, which contains the definition of your custom comparison.

참고

IStructuralComparable 인터페이스는 정렬 또는 정렬에 대 한 구조적 비교만 지원 합니다.The IStructuralComparable interface supports only structural comparisons for sorting or ordering. IStructuralEquatable 인터페이스는 구조적 같음에 대 한 사용자 지정 비교를 지원 합니다.The IStructuralEquatable interface supports custom comparisons for structural equality.

.NET Framework는 두 명의 기본 비교자를 제공합니다.The .NET Framework provides two default comparers. 하나는 StructuralComparisons.StructuralComparer 속성에서 반환 됩니다. 다른는 Comparer<T>.Default 속성에서 반환 됩니다.One is returned by the StructuralComparisons.StructuralComparer property; the other is returned by the Comparer<T>.Default property.

제네릭 튜플 클래스 (Tuple<T1>, Tuple<T1,T2>, Tuple<T1,T2,T3>등) 및 Array 클래스는 IStructuralComparable 인터페이스의 명시적 구현을 제공 합니다.The generic tuple classes (Tuple<T1>, Tuple<T1,T2>, Tuple<T1,T2,T3>, and so on) and the Array class provide explicit implementations of the IStructuralComparable interface. 배열 또는 튜플의 현재 C#인스턴스를 IStructuralComparable 인터페이스 값으로 캐스팅 (in) 또는 변환 (Visual Basic) 하거나 IComparer 구현을 CompareTo 메서드에 대 한 인수로 제공 하 여 배열 또는 컬렉션에 대 한 사용자 지정 정렬 순서를 정의할 수 있습니다.By casting (in C#) or converting (in Visual Basic) the current instance of an array or tuple to an IStructuralComparable interface value and providing your IComparer implementation as an argument to the CompareTo method, you can define a custom sort order for the array or collection. 그러나 대부분의 경우에는 CompareTo 메서드를 직접 호출 하지 않습니다.However, you do not call the CompareTo method directly in most cases. 대신 Sort(Array, IComparer)와 같은 정렬 메서드를 통해 CompareTo 메서드를 호출 합니다.Instead, the CompareTo method is called by sorting methods such as Sort(Array, IComparer). 이 경우 IComparer 구현을 정의 하 고 정렬 메서드 또는 컬렉션 개체의 클래스 생성자에 인수로 전달 합니다.In this case, you define your IComparer implementation and pass it as an argument to a sorting method or collection object's class constructor. 사용자 지정 비교자를 사용 하는 CompareTo 메서드는 컬렉션이 정렬 될 때마다 자동으로 호출 됩니다.The CompareTo method with your custom comparer is then called automatically whenever the collection is sorted.

메서드

CompareTo(Object, IComparer)

정렬 순서에서 현재 컬렉션 개체의 위치가 다른 개체보다 앞인지, 뒤인지 또는 동일한지를 확인합니다.Determines whether the current collection object precedes, occurs in the same position as, or follows another object in the sort order.

적용 대상

추가 정보