Bagikan melalui


IStructuralComparable Antarmuka

Definisi

Mendukung perbandingan struktural objek koleksi.

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

Contoh

Contoh berikut membuat array Tuple<T1,T2,T3,T4,T5,T6> objek yang berisi data populasi untuk tiga kota AS dari 1960 hingga 2000. Komponen pertama sextuple adalah nama kota. Lima komponen yang tersisa mewakili populasi pada interval sepuluh tahun dari 1960 hingga 2000.

Kelas ini PopulationComparer menyediakan IComparer implementasi yang memungkinkan array sextuples diurutkan oleh salah satu komponennya. Dua nilai diberikan ke PopulationComparer kelas dalam konstruktornya: posisi komponen yang menentukan urutan sortir, dan nilai Boolean yang menunjukkan apakah objek tuple harus diurutkan dalam urutan naik atau turun.

Contoh kemudian menampilkan elemen dalam array dalam urutan yang tidak diurutkan, mengurutkannya berdasarkan komponen ketiga (populasi pada tahun 1970) dan menampilkannya, lalu mengurutkannya berdasarkan komponen keenam (populasi pada tahun 2000) dan menampilkannya. Perhatikan bahwa contoh tidak secara langsung memanggil CompareTo metode . Metode ini dipanggil secara implisit oleh Sort(Array, IComparer) metode untuk setiap objek tuple dalam 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)

Keterangan

Antarmuka memungkinkan IStructuralComparable Anda menerapkan perbandingan yang disesuaikan untuk anggota koleksi. Artinya, Anda dapat menentukan dengan tepat apa artinya bagi satu objek koleksi untuk mendahului, mengikuti, atau terjadi dalam posisi yang sama dalam urutan sortir sebagai objek koleksi kedua. Anda kemudian dapat menentukan bahwa definisi ini digunakan dengan jenis koleksi yang menerima IStructuralComparable antarmuka.

Antarmuka memiliki satu anggota, CompareTo, yang menentukan apakah objek koleksi saat ini kurang dari, sama dengan, atau lebih besar dari objek kedua dalam urutan pengurutan. Perbandingan aktual anggota atau elemen dalam instans saat ini dengan yang ada di objek kedua dilakukan oleh IComparer implementasi antarmuka, yang berisi definisi perbandingan kustom Anda.

Catatan

Antarmuka IStructuralComparable hanya mendukung perbandingan struktural untuk pengurutan atau pengurutan. Antarmuka IStructuralEquatable mendukung perbandingan kustom untuk kesetaraan struktural.

.NET Framework menyediakan dua pembanding default. Satu dikembalikan oleh StructuralComparisons.StructuralComparer properti ; yang lain dikembalikan oleh Comparer<T>.Default properti .

Kelas tuple generik (Tuple<T1>, , Tuple<T1,T2,T3>Tuple<T1,T2>, dan sebagainya) dan Array kelas menyediakan implementasi eksplisit antarmukaIStructuralComparable. Dengan mentransmisikan (dalam C#) atau mengonversi (di Visual Basic) instans array atau tuple saat ini ke IStructuralComparable nilai antarmuka dan menyediakan implementasi Anda IComparer sebagai argumen ke CompareTo metode , Anda dapat menentukan urutan pengurutan kustom untuk array atau koleksi. Namun, Anda tidak memanggil metode secara CompareTo langsung dalam banyak kasus. Sebaliknya, CompareTo metode ini dipanggil dengan mengurutkan metode seperti Sort(Array, IComparer). Dalam hal ini, Anda menentukan implementasi dan IComparer meneruskannya sebagai argumen ke metode pengurutan atau konstruktor kelas objek koleksi. Metode CompareTo dengan perbandingan kustom Anda kemudian dipanggil secara otomatis setiap kali koleksi diurutkan.

Metode

CompareTo(Object, IComparer)

Menentukan apakah objek koleksi saat ini mendahului, terjadi dalam posisi yang sama seperti, atau mengikuti objek lain dalam urutan pengurutan.

Berlaku untuk

Lihat juga