IStructuralComparable Gränssnitt

Definition

Stöder strukturell jämförelse av samlingsobjekt.

public interface class IStructuralComparable
public interface IStructuralComparable
type IStructuralComparable = interface
Public Interface IStructuralComparable
Härledda

Exempel

I följande exempel skapas en matris med Tuple<T1,T2,T3,T4,T5,T6> objekt som innehåller befolkningsdata för tre amerikanska städer från 1960 till 2000. Sextupleens första komponent är stadens namn. De återstående fem komponenterna representerar populationen med tio års mellanrum från 1960 till 2000.

Klassen PopulationComparer tillhandahåller en IComparer implementering som gör att matrisen med sextupler kan sorteras efter någon av dess komponenter. Två värden tillhandahålls till klassen i konstruktorn: positionen för PopulationComparer komponenten som definierar sorteringsordningen och ett booleskt värde som anger om tuppelns objekt ska sorteras i stigande eller fallande ordning.

Exemplet visar sedan elementen i matrisen i osorterad ordning, sorterar dem efter den tredje komponenten (populationen 1970) och visar dem och sorterar dem sedan efter den sjätte komponenten (populationen år 2000) och visar dem. Observera att exemplet inte anropar CompareTo metoden direkt. Metoden anropas implicit av Sort(Array, IComparer) metoden för varje tuppelns objekt i matrisen.

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)

Kommentarer

Med IStructuralComparable gränssnittet kan du implementera anpassade jämförelser för samlingsmedlemmar. Det innebär att du kan definiera exakt vad det innebär för ett samlingsobjekt att föregå, följa eller förekommer i samma position i sorteringsordningen som ett andra samlingsobjekt. Du kan sedan ange att den här definitionen ska användas med en samlingstyp IStructuralComparable som accepterar gränssnittet.

Gränssnittet har en enda medlem, CompareTo, som avgör om det aktuella samlingsobjektet är mindre än, lika med eller större än ett andra objekt i sorteringsordningen. Den faktiska jämförelsen av medlemmar eller element i den aktuella instansen med dem i ett andra objekt utförs av en IComparer gränssnittsimplementering, som innehåller definitionen av din anpassade jämförelse.

Note

Gränssnittet IStructuralComparable stöder endast strukturella jämförelser för sortering eller sortering. Gränssnittet IStructuralEquatable stöder anpassade jämförelser för strukturell likhet.

.NET Framework innehåller två standardjäxare. Den ena returneras av StructuralComparisons.StructuralComparer egenskapen, den andra returneras av egenskapen Comparer<T>.Default .

De generiska tupppelklasserna (, , och så vidare) och Array klassen tillhandahåller explicita implementeringar av IStructuralComparable gränssnittet. Tuple<T1,T2,T3>Tuple<T1,T2>Tuple<T1> Genom att konvertera (i C#) eller konvertera (i Visual Basic) den aktuella instansen av en matris eller tuppeln till ett IStructuralComparable gränssnittsvärde och ange din IComparer implementering som ett argument till metoden CompareTo kan du definiera en anpassad sorteringsordning för matrisen eller samlingen. Du anropar CompareTo dock inte metoden direkt i de flesta fall. CompareTo I stället anropas metoden genom sorteringsmetoder som Sort(Array, IComparer). I det här fallet definierar du implementeringen IComparer och skickar den som ett argument till en sorteringsmetod eller samlingsobjektets klasskonstruktor. Metoden CompareTo med din anpassade jämförelse anropas sedan automatiskt när samlingen sorteras.

Metoder

Name Description
CompareTo(Object, IComparer)

Avgör om det aktuella samlingsobjektet föregår, inträffar i samma position som eller följer ett annat objekt i sorteringsordningen.

Gäller för

Se även