IStructuralComparable IStructuralComparable IStructuralComparable IStructuralComparable Interface

Definición

Admite la comparación estructural de objetos de colección.Supports the structural comparison of collection objects.

public interface class IStructuralComparable
public interface IStructuralComparable
type IStructuralComparable = interface
Public Interface IStructuralComparable
Derivado

Ejemplos

En el ejemplo siguiente se crea una matriz de Tuple<T1,T2,T3,T4,T5,T6> objetos que contiene los datos de población de tres ciudades de Estados Unidos de 1960 a 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. Primer componente de la séxtupla es el nombre de la ciudad.The sextuple's first component is the city name. Los cinco componentes restantes representan la población en intervalos de diez años de 1960 a 2000.The remaining five components represent the population at ten-year intervals from 1960 to 2000.

El PopulationComparer clase proporciona un IComparer implementación que permite a la matriz de séxtuplas ordenarse por cualquiera de sus componentes.The PopulationComparer class provides an IComparer implementation that allows the array of sextuples to be sorted by any one of its components. Se proporcionan dos valores para el PopulationComparer clase en su constructor: la posición del componente que define el criterio de ordenación y un valor booleano que indica si los objetos de tupla deben ordenarse en orden ascendente o descendente.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.

El ejemplo, a continuación, muestra los elementos de la matriz sin ordenar, ordena por el tercer componente (la población de 1970) y mostrarlos y, a continuación, ordena por el sexto componente (la población de 2000) y mostrarlos.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. Tenga en cuenta que el ejemplo no llama directamente el CompareTo método.Note that the example does not directly call the CompareTo method. Se llama al método de forma implícita el Sort(Array, IComparer) método para cada objeto de tupla de la matriz.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)

Comentarios

El IStructuralComparable interfaz le permite implementar comparaciones personalizadas para los miembros de la colección.The IStructuralComparable interface enables you to implement customized comparisons for collection members. Es decir, puede definir precisamente lo que significa para que un objeto de colección que colocar delante, siga ni se producen en la misma posición en el criterio de ordenación como un segundo objeto de colección.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. A continuación, puede especificar que esta definición se usa con un tipo de colección que acepta el IStructuralComparable interfaz.You can then specify that this definition be used with a collection type that accepts the IStructuralComparable interface.

La interfaz tiene un solo miembro, CompareTo, que determina si el objeto de colección actual es menor, igual o mayor que un segundo objeto en el criterio de ordenación.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 comparación de los miembros o elementos de la instancia actual con los de un segundo objeto real se realiza mediante un IComparer la implementación de interfaz, que contiene la definición de la comparación personalizada.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.

Nota

El IStructuralComparable interfaz solo admite comparaciones estructurales de ordenación o clasificación.The IStructuralComparable interface supports only structural comparisons for sorting or ordering. El IStructuralEquatable interfaz admite las comparaciones personalizadas para comprobar su igualdad estructural.The IStructuralEquatable interface supports custom comparisons for structural equality.

.NET Framework proporciona a dos comparadores de forma predeterminada.The .NET Framework provides two default comparers. Uno es devuelto por la StructuralComparisons.StructuralComparer propiedad; la otra es devuelto por la Comparer<T>.Default propiedad.One is returned by the StructuralComparisons.StructuralComparer property; the other is returned by the Comparer<T>.Default property.

Las clases de tupla genéricas (Tuple<T1>, Tuple<T1,T2>, Tuple<T1,T2,T3>, etc.) y la Array clase proporcione implementaciones explícitas de la IStructuralComparable interfaz.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. Conversión (en C#) o convirtiendo (en Visual Basic) de la instancia actual de una matriz o una tupla a un IStructuralComparable valor de la interfaz y proporcionar su IComparer implementación como argumento a la CompareTo método, puede definir un criterio de ordenación personalizado para el matriz o colección.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. Sin embargo, no se llama el CompareTo método directamente en la mayoría de los casos.However, you do not call the CompareTo method directly in most cases. En su lugar, el CompareTo se llama al método, como los métodos de ordenación Sort(Array, IComparer).Instead, the CompareTo method is called by sorting methods such as Sort(Array, IComparer). En este caso, define su IComparer implementación y pasarlo como argumento al constructor de clase de una ordenación método o una colección del objeto.In this case, you define your IComparer implementation and pass it as an argument to a sorting method or collection object's class constructor. El CompareTo método con el comparador personalizado, a continuación, se llama automáticamente cada vez que se ordena la colección.The CompareTo method with your custom comparer is then called automatically whenever the collection is sorted.

Métodos

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

Determina si el objeto de colección actual precede o sigue a otro objeto en el criterio de ordenación, o aparece en la misma posición que él.Determines whether the current collection object precedes, occurs in the same position as, or follows another object in the sort order.

Se aplica a

Consulte también: