IStructuralComparable IStructuralComparable IStructuralComparable IStructuralComparable Interface

定義

コレクション オブジェクトの構造比較をサポートします。Supports the structural comparison of collection objects.

public interface class IStructuralComparable
public interface IStructuralComparable
type IStructuralComparable = interface
Public Interface IStructuralComparable
派生

次の例の配列を作成するTuple<T1,T2,T3,T4,T5,T6>1960 年から 2000 の 3 つの米国都市の人口データが含まれているオブジェクト。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 つのコンポーネントでは、1960 年から 2000 の 10 年間の間隔で人口を表します。The remaining five components represent the population at ten-year intervals from 1960 to 2000.

PopulationComparerクラスには、 IComparerにより、6つ組の配列をそのいずれかのコンポーネントでソートできるようにするIComparer実装を提供します。The PopulationComparer class provides an IComparer implementation that allows the array of sextuples to be sorted by any one of its components. PopulationComparerクラスのコンストラクターには 2 つの値があります。 並べ替え順序を定義するコンポーネントとタプルオブジェクトを昇順または降順で並べ替える必要があるかどうかを示すブール値の位置です。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.

例では、し並べ替え配列の要素を表示します、3 番目のコンポーネント (1970 年の人口) で並べ替えてと、それらが表示されます (2000年のカタログ作成) の 6 番目のコンポーネントで並べ替えてし、それらが表示されます。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. つまり、正確な意味を前には、または 2 つ目のコレクション オブジェクトとして、並べ替え順序において同じ位置に出現する 1 つのコレクション オブジェクトを定義できます。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.

インターフェイスが 1 つのメンバーにはCompareTo、現在のコレクション オブジェクトが同じか、または並べ替え順序で 2 番目のオブジェクトより大きいよりも小さいかどうかを決定します。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. メンバーまたは 2 番目のオブジェクトと現在のインスタンス内の要素の実際の比較は、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 では、2 つの既定の比較子を提供します。The .NET Framework provides two default comparers. によって返される 1 つ、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#) または (Visual Basic) では、配列またはタプルの現在のインスタンスに変換して、IStructuralComparableインターフェイスの値を提供して、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. 代わりに、CompareTo並べ替え方法など、メソッドを呼び出してSort(Array, IComparer)します。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) CompareTo(Object, IComparer) CompareTo(Object, IComparer) CompareTo(Object, IComparer)

現在のコレクション オブジェクトの並べ替え順序での位置が、別のオブジェクトと比べて前か、後か、または同じかを判断します。Determines whether the current collection object precedes, occurs in the same position as, or follows another object in the sort order.

適用対象

こちらもご覧ください