IStructuralComparable Interfaccia

Definizione

Supporta il confronto strutturale di oggetti della raccolta.Supports the structural comparison of collection objects.

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

Esempi

Nell'esempio seguente viene creata una matrice di oggetti Tuple<T1,T2,T3,T4,T5,T6> che contiene i dati della popolazione per tre città statunitensi da 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. Il primo componente di sestupla è il nome della città.The sextuple's first component is the city name. I restanti cinque componenti rappresentano la popolazione a intervalli di dieci anni da 1960 a 2000.The remaining five components represent the population at ten-year intervals from 1960 to 2000.

La classe PopulationComparer fornisce un'implementazione di IComparer che consente l'ordinamento della matrice di sestuple in base a uno dei relativi componenti.The PopulationComparer class provides an IComparer implementation that allows the array of sextuples to be sorted by any one of its components. Vengono forniti due valori alla classe PopulationComparer nel relativo costruttore, ovvero la posizione del componente che definisce l'ordinamento e un valore booleano che indica se gli oggetti di tupla devono essere ordinati in ordine crescente o decrescente.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.

Nell'esempio vengono quindi visualizzati gli elementi nella matrice in ordine non ordinato, li ordina in base al terzo componente (la popolazione in 1970) e li Visualizza, quindi li ordina in base al sesto componente (la popolazione in 2000) e li Visualizza.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. Si noti che l'esempio non chiama direttamente il metodo CompareTo.Note that the example does not directly call the CompareTo method. Il metodo viene chiamato in modo implicito dal metodo Sort(Array, IComparer) per ogni oggetto tupla nella matrice.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)

Commenti

L'interfaccia IStructuralComparable consente di implementare confronti personalizzati per i membri della raccolta.The IStructuralComparable interface enables you to implement customized comparisons for collection members. In altre parole, è possibile definire esattamente ciò che significa che un oggetto raccolta precede, segue o si trova nella stessa posizione di un secondo oggetto della raccolta nell'ordinamento.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. È quindi possibile specificare che questa definizione venga utilizzata con un tipo di raccolta che accetta l'interfaccia IStructuralComparable.You can then specify that this definition be used with a collection type that accepts the IStructuralComparable interface.

L'interfaccia dispone di un singolo membro, CompareTo, che determina se l'oggetto raccolta corrente è minore, uguale o maggiore di un secondo oggetto nell'ordinamento.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. Il confronto effettivo dei membri o degli elementi nell'istanza corrente con quelli di un secondo oggetto viene eseguito da un'implementazione di IComparer interfaccia, che contiene la definizione del confronto personalizzato.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

L'interfaccia IStructuralComparable supporta solo i confronti strutturali per l'ordinamento o l'ordinamento.The IStructuralComparable interface supports only structural comparisons for sorting or ordering. L'interfaccia IStructuralEquatable supporta i confronti personalizzati per l'uguaglianza strutturale.The IStructuralEquatable interface supports custom comparisons for structural equality.

Il .NET Framework fornisce due operatori di confronto predefiniti.The .NET Framework provides two default comparers. Una viene restituita dalla proprietà StructuralComparisons.StructuralComparer; l'altro viene restituito dalla proprietà Comparer<T>.Default.One is returned by the StructuralComparisons.StructuralComparer property; the other is returned by the Comparer<T>.Default property.

Le classi di tuple generiche (Tuple<T1>, Tuple<T1,T2>, Tuple<T1,T2,T3>e così via) e la classe Array forniscono implementazioni esplicite dell'interfaccia 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. Eseguendo il cast ( C#in) o convertendo (in Visual Basic) l'istanza corrente di una matrice o di una tupla in un valore di interfaccia IStructuralComparable e fornendo l'implementazione di IComparer come argomento al metodo CompareTo, è possibile definire un ordinamento personalizzato per la matrice o la raccolta.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. Tuttavia, non è possibile chiamare direttamente il metodo CompareTo nella maggior parte dei casi.However, you do not call the CompareTo method directly in most cases. Al contrario, il metodo CompareTo viene chiamato dai metodi di ordinamento, ad esempio Sort(Array, IComparer).Instead, the CompareTo method is called by sorting methods such as Sort(Array, IComparer). In questo caso, è possibile definire l'implementazione di IComparer e passarla come argomento a un metodo di ordinamento o a un costruttore di classe dell'oggetto della raccolta.In this case, you define your IComparer implementation and pass it as an argument to a sorting method or collection object's class constructor. Il metodo CompareTo con l'operatore di confronto personalizzato viene quindi chiamato automaticamente ogni volta che la raccolta viene ordinata.The CompareTo method with your custom comparer is then called automatically whenever the collection is sorted.

Metodi

CompareTo(Object, IComparer)

Determina se l'oggetto raccolta corrente precede, è nella stessa posizione o segue un altro oggetto nell'ordinamento.Determines whether the current collection object precedes, occurs in the same position as, or follows another object in the sort order.

Si applica a

Vedi anche