IStructuralComparable IStructuralComparable IStructuralComparable IStructuralComparable Interface

Définition

Prend en charge la comparaison structurelle des objets collection.Supports the structural comparison of collection objects.

public interface class IStructuralComparable
public interface IStructuralComparable
type IStructuralComparable = interface
Public Interface IStructuralComparable
Dérivé

Exemples

L’exemple suivant crée un tableau de Tuple<T1,T2,T3,T4,T5,T6> objets qui contient les données de la population pour trois des villes américaines de 1960 à 2000.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. Premier composant du sextuple est le nom de ville.The sextuple's first component is the city name. Les cinq composants restants représentent la population à des intervalles de dix ans de 1960 à 2000.The remaining five components represent the population at ten-year intervals from 1960 to 2000.

Le PopulationComparer classe fournit un IComparer implémentation qui autorise le tableau de sextuples à être trié par l’un de ses composants.The PopulationComparer class provides an IComparer implementation that allows the array of sextuples to be sorted by any one of its components. Deux valeurs sont fournies à la PopulationComparer classe dans son constructeur : la position du composant qui définit l’ordre de tri et une valeur booléenne qui indique si les objets de tuple doivent être triés dans l’ordre croissant ou décroissant.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.

L’exemple puis affiche les éléments dans le tableau dans un ordre aléatoire, les trie par le troisième composant (population en 1970) et les affiche, puis les trie par le sixième composant (population en 2000) et les affiche.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. Notez que l’exemple n’appelle pas directement la CompareTo (méthode).Note that the example does not directly call the CompareTo method. La méthode est appelée implicitement par la Sort(Array, IComparer) méthode pour chaque objet tuple dans le tableau.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)

Remarques

Le IStructuralComparable interface vous permet d’implémenter des comparaisons personnalisées pour les membres de la collection.The IStructuralComparable interface enables you to implement customized comparisons for collection members. Autrement dit, vous pouvez définir précisément ce que cela signifie pour un objet collection de précéder, suivre ou se produisent dans la même position dans l’ordre de tri qu’un deuxième objet de collection.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. Vous pouvez ensuite spécifier que cette définition soit utilisée avec un type de collection qui accepte le IStructuralComparable interface.You can then specify that this definition be used with a collection type that accepts the IStructuralComparable interface.

L’interface a un membre unique, CompareTo, qui détermine si l’objet collection actuel est inférieur à, égal à ou supérieur à un deuxième objet dans l’ordre de tri.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. La comparaison réelle des membres ou éléments de l’instance actuelle avec ceux d’un deuxième objet est effectuée par un IComparer implémentation d’interface, qui contient la définition de votre comparaison personnalisée.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.

Notes

Le IStructuralComparable interface prend en charge uniquement les comparaisons structurelles de tri.The IStructuralComparable interface supports only structural comparisons for sorting or ordering. Le IStructuralEquatable interface prend en charge les comparaisons personnalisées pour l’égalité structurelle.The IStructuralEquatable interface supports custom comparisons for structural equality.

Le .NET Framework fournit deux comparateurs par défaut.The .NET Framework provides two default comparers. Une est retournée par la StructuralComparisons.StructuralComparer propriété ; l’autre est retournée par la Comparer<T>.Default propriété.One is returned by the StructuralComparisons.StructuralComparer property; the other is returned by the Comparer<T>.Default property.

Les classes de tuple génériques (Tuple<T1>, Tuple<T1,T2>, Tuple<T1,T2,T3>, et ainsi de suite) et le Array classe fournissent des implémentations explicites de le IStructuralComparable interface.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. En castant (en c#) ou en convertissant (en Visual Basic) de l’instance actuelle d’un tableau ou un tuple à un IStructuralComparable valeur de l’interface et en fournissant votre IComparer mise en œuvre en tant qu’argument à la CompareTo (méthode), vous pouvez définir un ordre de tri personnalisé pour le tableau ou collection.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. Toutefois, vous n’appelez pas la CompareTo (méthode) directement dans la plupart des cas.However, you do not call the CompareTo method directly in most cases. Au lieu de cela, le CompareTo méthode est appelée par les méthodes de tri comme Sort(Array, IComparer).Instead, the CompareTo method is called by sorting methods such as Sort(Array, IComparer). Dans ce cas, vous définissez votre IComparer implémentation et passez-le en tant qu’argument au constructeur de classe de tri (méthode) ou une collection d’un objet.In this case, you define your IComparer implementation and pass it as an argument to a sorting method or collection object's class constructor. Le CompareTo méthode avec votre comparateur personnalisé est ensuite appelée automatiquement chaque fois que la collection est triée.The CompareTo method with your custom comparer is then called automatically whenever the collection is sorted.

Méthodes

CompareTo(Object, IComparer) CompareTo(Object, IComparer) CompareTo(Object, IComparer) CompareTo(Object, IComparer)

Détermine si l'objet collection actuel précède, se situe à la même position que, ou suit un autre objet dans l'ordre de tri.Determines whether the current collection object precedes, occurs in the same position as, or follows another object in the sort order.

S’applique à

Voir aussi