IStructuralComparable Schnittstelle

Definition

Unterstützt den Strukturvergleich von Auflistungsobjekten.

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

Beispiele

Im folgenden Beispiel wird ein Array von Tuple<T1,T2,T3,T4,T5,T6> Objekten erstellt, das Einwohnerdaten für drei US-Städte von 1960 bis 2000 enthält. Die erste Komponente des Sextupels ist der Stadtname. Die restlichen fünf Komponenten stellen die Bevölkerung in Zehnjahresintervallen von 1960 bis 2000 dar.

Die PopulationComparer -Klasse stellt eine IComparer Implementierung bereit, mit der das Array von Sextupeln nach einer ihrer Komponenten sortiert werden kann. Der Klasse in ihrem PopulationComparer Konstruktor werden zwei Werte bereitgestellt: die Position der Komponente, die die Sortierreihenfolge definiert, und ein boolescher Wert, der angibt, ob die Tupelobjekte in aufsteigender oder absteigender Reihenfolge sortiert werden sollen.

Das Beispiel zeigt dann die Elemente im Array in unsortierter Reihenfolge an, sortiert sie nach der dritten Komponente (die Auffüllung im Jahr 1970) und zeigt sie an, sortiert sie dann nach der sechsten Komponente (die Auffüllung im Jahr 2000) und zeigt sie an. Beachten Sie, dass die -Methode im Beispiel nicht direkt aufgerufen wird CompareTo . Die -Methode wird implizit von der Sort(Array, IComparer) -Methode für jedes Tupelobjekt im Array aufgerufen.

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)

Hinweise

Mit IStructuralComparable der Schnittstelle können Sie benutzerdefinierte Vergleiche für Sammlungsmitglieder implementieren. Das heißt, Sie können genau definieren, was es bedeutet, dass ein Sammlungsobjekt an derselben Position in der Sortierreihenfolge wie ein zweites Auflistungsobjekt vorangestellt, folgt oder auftritt. Anschließend können Sie angeben, dass diese Definition mit einem Auflistungstyp verwendet wird, der die IStructuralComparable Schnittstelle akzeptiert.

Die Schnittstelle verfügt über ein einzelnes Element , das bestimmt, CompareToob das aktuelle Auflistungsobjekt kleiner als, gleich oder größer als ein zweites Objekt in der Sortierreihenfolge ist. Der tatsächliche Vergleich der Member oder Elemente im aktuellen instance mit denen in einem zweiten Objekt wird von einer IComparer Schnittstellenimplementierung durchgeführt, die die Definition Ihres benutzerdefinierten Vergleichs enthält.

Hinweis

Die IStructuralComparable Schnittstelle unterstützt nur Strukturvergleiche zum Sortieren oder Sortieren. Die IStructuralEquatable Schnittstelle unterstützt benutzerdefinierte Vergleiche für strukturelle Gleichheit.

Die .NET Framework bietet zwei Standardvergleiche. Eine wird von der StructuralComparisons.StructuralComparer -Eigenschaft zurückgegeben, die andere wird von der Comparer<T>.Default -Eigenschaft zurückgegeben.

Die generischen Tupelklassen (, , usw.) und die Array -Klasse stellen explizite Implementierungen der IStructuralComparable Schnittstelle bereit. Tuple<T1,T2,T3>Tuple<T1,T2>Tuple<T1> Indem Sie die aktuelle instance eines Arrays oder Tupels in einen IStructuralComparable Schnittstellenwert umwandeln (in C#) oder konvertieren und Ihre IComparer Implementierung als Argument für die CompareTo -Methode bereitstellen, können Sie eine benutzerdefinierte Sortierreihenfolge für das Array oder die Auflistung definieren. In den meisten Fällen rufen Sie die CompareTo Methode jedoch nicht direkt auf. Stattdessen wird die CompareTo -Methode durch Sortiermethoden wie Sort(Array, IComparer)aufgerufen. In diesem Fall definieren Sie Ihre IComparer Implementierung und übergeben sie als Argument an den Klassenkonstruktor einer Sortiermethode oder eines Auflistungsobjekts. Die CompareTo Methode mit Dem benutzerdefinierten Vergleich wird dann automatisch aufgerufen, wenn die Auflistung sortiert wird.

Methoden

CompareTo(Object, IComparer)

Bestimmt, ob das aktuelle Auflistungsobjekt in der Sortierreihenfolge vor oder nach einem anderen Objekt oder an derselben Position auftritt.

Gilt für:

Weitere Informationen