IStructuralComparable Interface

Definitie

Ondersteunt de structurele vergelijking van verzamelingsobjecten.

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

Voorbeelden

In het volgende voorbeeld wordt een matrix gemaakt met Tuple<T1,T2,T3,T4,T5,T6> objecten die populatiegegevens voor drie Amerikaanse steden van 1960 tot 2000 bevatten. Het eerste onderdeel van sextuple is de plaatsnaam. De overige vijf onderdelen vertegenwoordigen de populatie met intervallen van tien jaar van 1960 tot 2000.

De PopulationComparer klasse biedt een IComparer implementatie waarmee de matrix van sekstuples kan worden gesorteerd op een van de onderdelen ervan. Er worden twee waarden opgegeven voor de PopulationComparer klasse in de constructor: de positie van het onderdeel dat de sorteervolgorde definieert en een Booleaanse waarde die aangeeft of de tuple-objecten in oplopende of aflopende volgorde moeten worden gesorteerd.

In het voorbeeld worden vervolgens de elementen in de matrix in niet-gesorteerde volgorde weergegeven, gesorteerd op het derde onderdeel (de populatie in 1970) en weergegeven en vervolgens gesorteerd op het zesde onderdeel (de populatie in 2000) en weergegeven. Houd er rekening mee dat in het voorbeeld de methode niet rechtstreeks wordt aangeroepen CompareTo . De methode wordt impliciet aangeroepen door de Sort(Array, IComparer) methode voor elk tuple-object in de matrix.

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)

Opmerkingen

Met de IStructuralComparable interface kunt u aangepaste vergelijkingen implementeren voor verzamelingsleden. Dat wil zeggen dat u precies kunt definiëren wat dit betekent voor één verzamelingsobject dat voorafgaat aan, volgt of zich in dezelfde positie in de sorteervolgorde bevindt als een tweede verzamelingsobject. Vervolgens kunt u opgeven dat deze definitie wordt gebruikt met een verzamelingstype dat de IStructuralComparable interface accepteert.

De interface heeft één lid, CompareTowaarmee wordt bepaald of het huidige verzamelingsobject kleiner is dan, gelijk is aan of groter is dan een tweede object in de sorteervolgorde. De daadwerkelijke vergelijking van de leden of elementen in het huidige exemplaar met die in een tweede object wordt uitgevoerd door een IComparer interface-implementatie, die de definitie van uw aangepaste vergelijking bevat.

Opmerking

De IStructuralComparable interface ondersteunt alleen structurele vergelijkingen voor sorteren of ordenen. De IStructuralEquatable interface ondersteunt aangepaste vergelijkingen voor structurele gelijkheid.

.NET Framework biedt twee standaard comparers. De ene wordt geretourneerd door de StructuralComparisons.StructuralComparer eigenschap; de andere wordt geretourneerd door de Comparer<T>.Default eigenschap.

De algemene tuple-klassen (Tuple<T1>, Tuple<T1,T2>enzovoort Tuple<T1,T2,T3>) en de Array klasse bieden expliciete implementaties van de IStructuralComparable interface. Door het gieten (in C#) of het converteren (in Visual Basic) van het huidige exemplaar van een matrix of tuple naar een IStructuralComparable interfacewaarde en de implementatie van uw IComparer als argument voor de methode CompareTo kunt u een aangepaste sorteervolgorde voor de matrix of verzameling definiëren. In de meeste gevallen roept u de CompareTo methode echter niet rechtstreeks aan. In plaats daarvan wordt de CompareTo methode aangeroepen door sorteermethoden zoals Sort(Array, IComparer). In dit geval definieert u uw IComparer implementatie en geeft u deze als argument door aan de klasseconstructor van een sorteermethode of verzamelingsobject. De CompareTo methode met uw aangepaste vergelijkingsfunctie wordt vervolgens automatisch aangeroepen wanneer de verzameling wordt gesorteerd.

Methoden

Name Description
CompareTo(Object, IComparer)

Bepaalt of het huidige verzamelingsobject voorafgaat, zich op dezelfde positie bevindt als of een ander object in de sorteervolgorde volgt.

Van toepassing op

Zie ook