IStructuralComparable Gränssnitt
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
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. |