IStructuralComparable IStructuralComparable IStructuralComparable IStructuralComparable Interface

Definition

Unterstützt den Strukturvergleich von Auflistungsobjekten.Supports the structural comparison of collection objects.

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

Beispiele

Das folgende Beispiel erstellt ein Array von Tuple<T1,T2,T3,T4,T5,T6> Objekte, die Bevölkerungsdaten für drei US-Orte von 1960 bis 2000 enthält.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. Das Sextupel die erste Komponente ist der Name des Orts.The sextuple's first component is the city name. Die verbleibenden fünf Komponenten stellen die Auffüllung in Abständen von zehn Jahren von 1960 auf 2000.The remaining five components represent the population at ten-year intervals from 1960 to 2000.

Die PopulationComparer -Klasse stellt eine IComparer Implementierung, mit das Array von Sextupeln eine seiner Komponenten sortiert werden können.The PopulationComparer class provides an IComparer implementation that allows the array of sextuples to be sorted by any one of its components. Zwei Werte werden bereitgestellt, um die PopulationComparer Klasse in seinem Konstruktor: 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.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.

Im Beispiel wird dann zeigt die Elemente im Array in der unsortierten Reihenfolge sortiert sie nach der dritten Komponente (die Auffüllung in 1970) und zeigt sie an, und sortiert sie nach der sechsten Komponente (die Bevölkerung im Jahr 2000) und anschließend angezeigt.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. Beachten Sie, die im Beispiel nicht direkt aufgerufen wird die CompareTo Methode.Note that the example does not directly call the CompareTo method. Die Methode aufgerufen wird, implizit von der Sort(Array, IComparer) Methode für jedes Tupelobjekt im Array.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)

Hinweise

Die IStructuralComparable -Schnittstelle ermöglicht Ihnen, benutzerdefinierte Vergleiche für Member der Auflistung zu implementieren.The IStructuralComparable interface enables you to implement customized comparisons for collection members. Das heißt, können Sie definieren, genau Bedeutung für ein Auflistungsobjekt, vorausgehen oder folgen treten in der gleichen Position in der Sortierreihenfolge als ein zweites Auflistungsobjekt.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. Anschließend können Sie angeben, dass diese Definition mit dem Auflistungstyp verwendet wird, akzeptiert die IStructuralComparable Schnittstelle.You can then specify that this definition be used with a collection type that accepts the IStructuralComparable interface.

Die Schnittstelle verfügt über einen einzelnen Member, CompareTo, der bestimmt, ob das aktuelle Auflistungsobjekt kleiner, gleich oder größer als ein zweites Objekt in der Sortierreihenfolge ist.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. Der Vergleich der die Elemente oder Elemente in der aktuellen Instanz, mit denen in einem zweiten Objekt erfolgt durch ein IComparer schnittstellenimplementierung, enthält die Definition von Ihrem benutzerdefinierten Vergleich.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.

Hinweis

Die IStructuralComparable Schnittstelle unterstützt nur die strukturelle Vergleiche für Anordnung oder Sortierung.The IStructuralComparable interface supports only structural comparisons for sorting or ordering. Die IStructuralEquatable Schnittstelle unterstützt benutzerdefinierte Vergleiche auf Strukturgleichheit überprüft.The IStructuralEquatable interface supports custom comparisons for structural equality.

.NET Framework bietet zwei Standardvergleiche.The .NET Framework provides two default comparers. Eine wird zurückgegeben, indem die StructuralComparisons.StructuralComparer Eigenschaft; der andere wird zurückgegeben, durch die Comparer<T>.Default Eigenschaft.One is returned by the StructuralComparisons.StructuralComparer property; the other is returned by the Comparer<T>.Default property.

Die generische Tuple-Klassen (Tuple<T1>, Tuple<T1,T2>, Tuple<T1,T2,T3>usw.) und die Array Klasse bereitstellen, explizite Implementierungen von der IStructuralComparable Schnittstelle.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. Durch Umwandlung (in c#) oder konvertieren (in Visual Basic) der aktuellen Instanz eines Arrays oder das Tupel mit einer IStructuralComparable Schnittstelle Wert und Ihre IComparer Implementierung als Argument an die CompareTo -Methode, Sie können eine benutzerdefinierte Sortierreihenfolge für definieren die Array oder einer Auflistung.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. Allerdings rufen Sie die CompareTo -Methode direkt in den meisten Fällen.However, you do not call the CompareTo method directly in most cases. Stattdessen die CompareTo Methode wird aufgerufen, durch Methoden wie z. B. sortieren Sort(Array, IComparer).Instead, the CompareTo method is called by sorting methods such as Sort(Array, IComparer). In diesem Fall definieren Sie Ihre IComparer Implementierung und an den Klassenkonstruktor eine Sortierung-Methode oder eine Auflistung des Objekts als Argument übergeben.In this case, you define your IComparer implementation and pass it as an argument to a sorting method or collection object's class constructor. Die CompareTo Methode mit dem benutzerdefinierten Vergleich wird dann automatisch aufgerufen, wenn die Auflistung sortiert wird.The CompareTo method with your custom comparer is then called automatically whenever the collection is sorted.

Methoden

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

Bestimmt, ob das aktuelle Auflistungsobjekt in der Sortierreihenfolge vor oder nach einem anderen Objekt oder an derselben Position auftritt.Determines whether the current collection object precedes, occurs in the same position as, or follows another object in the sort order.

Gilt für:

Siehe auch