Comparer<T> Comparer<T> Comparer<T> Comparer<T> Class

Definition

Stellt eine Basisklasse für Implementierungen der generischen IComparer<T>-Schnittstelle bereit.Provides a base class for implementations of the IComparer<T> generic interface.

generic <typename T>
public ref class Comparer abstract : System::Collections::Generic::IComparer<T>, System::Collections::IComparer
[System.Serializable]
public abstract class Comparer<T> : System.Collections.Generic.IComparer<T>, System.Collections.IComparer
type Comparer<'T> = class
    interface IComparer
    interface IComparer<'T>
Public MustInherit Class Comparer(Of T)
Implements IComparer, IComparer(Of T)

Typparameter

T

Der Typ der zu vergleichenden Objekte.The type of objects to compare.

Vererbung
Comparer<T>Comparer<T>Comparer<T>Comparer<T>
Attribute
Implementiert

Beispiele

Im folgende Beispiel wird eine Klasse abgeleitet BoxLengthFirst, aus der Comparer<T> Klasse.The following example derives a class, BoxLengthFirst, from the Comparer<T> class. Dieser Vergleich vergleicht zwei Objekte des Typs Box.This comparer compares two objects of type Box. Sortiert sie zunächst nach der Länge, und klicken Sie dann nach Höhe, und dann nach Breite.It sorts them first by length, then by height, and then by width. Die Box -Klasse implementiert die IComparable<T> Schnittstelle, um den Standardvergleich zwischen zwei steuern Box Objekte.The Box class implements the IComparable<T> interface to control the default comparison between two Box objects. Diese Standardimplementierung sortiert zuerst nach Höhe, und klicken Sie dann nach der Länge, und dann nach Breite.This default implementation sorts first by height, then by length, and then by width. Das Beispiel zeigt die Unterschiede zwischen den zwei Vergleiche von Sortieren einer Liste von Box Objekte zuerst mithilfe der BoxLengthFirst Vergleich, und klicken Sie dann mithilfe des Standardvergleichs.The example shows the differences between the two comparisons by sorting a list of Box objects first by using the BoxLengthFirst comparer and then by using the default comparer.

using System;
using System.Collections;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<Box> Boxes = new List<Box>();
        Boxes.Add(new Box(4, 20, 14));
        Boxes.Add(new Box(12, 12, 12));
        Boxes.Add(new Box(8, 20, 10));
        Boxes.Add(new Box(6, 10, 2));
        Boxes.Add(new Box(2, 8, 4));
        Boxes.Add(new Box(2, 6, 8));
        Boxes.Add(new Box(4, 12, 20));
        Boxes.Add(new Box(18, 10, 4));
        Boxes.Add(new Box(24, 4, 18));
        Boxes.Add(new Box(10, 4, 16));
        Boxes.Add(new Box(10, 2, 10));
        Boxes.Add(new Box(6, 18, 2));
        Boxes.Add(new Box(8, 12, 4));
        Boxes.Add(new Box(12, 10, 8));
        Boxes.Add(new Box(14, 6, 6));
        Boxes.Add(new Box(16, 6, 16));
        Boxes.Add(new Box(2, 8, 12));
        Boxes.Add(new Box(4, 24, 8));
        Boxes.Add(new Box(8, 6, 20));
        Boxes.Add(new Box(18, 18, 12));

        // Sort by an Comparer<T> implementation that sorts
        // first by the length.
        Boxes.Sort(new BoxLengthFirst());

        Console.WriteLine("H - L - W");
        Console.WriteLine("==========");
        foreach (Box bx in Boxes)
        {
            Console.WriteLine("{0}\t{1}\t{2}",
                bx.Height.ToString(), bx.Length.ToString(), 
                bx.Width.ToString());
        }

        Console.WriteLine();
        Console.WriteLine("H - L - W"); 
        Console.WriteLine("==========");

        // Get the default comparer that 
        // sorts first by the height.
        Comparer<Box> defComp = Comparer<Box>.Default;

        // Calling Boxes.Sort() with no parameter
        // is the same as calling Boxs.Sort(defComp)
        // because they are both using the default comparer.
        Boxes.Sort();

        foreach (Box bx in Boxes)
        {
            Console.WriteLine("{0}\t{1}\t{2}",
                bx.Height.ToString(), bx.Length.ToString(), 
                bx.Width.ToString());
        }


        // This explicit interface implementation
        // compares first by the length.
        // Returns -1 because the length of BoxA
        // is less than the length of BoxB.
        BoxLengthFirst LengthFirst = new BoxLengthFirst(); 

        Comparer<Box> bc = (Comparer<Box>) LengthFirst;

        Box BoxA = new Box(2, 6, 8);
        Box BoxB = new Box(10, 12, 14);
        int x = LengthFirst.Compare(BoxA, BoxB);
        Console.WriteLine();
        Console.WriteLine(x.ToString());

    

    }

}

public class BoxLengthFirst : Comparer<Box> 
{
    // Compares by Length, Height, and Width.
    public override int Compare(Box x, Box y)
    {
        if (x.Length.CompareTo(y.Length) != 0)
        {
            return x.Length.CompareTo(y.Length);
        }
        else if (x.Height.CompareTo(y.Height) != 0)
        {
            return x.Height.CompareTo(y.Height);
        }
        else if (x.Width.CompareTo(y.Width) != 0)
        {
            return x.Width.CompareTo(y.Width);
        }
        else
        {
            return 0;
        }
    }

}

// This class is not demonstrated in the Main method
// and is provided only to show how to implement
// the interface. It is recommended to derive
// from Comparer<T> instead of implementing IComparer<T>.
public class BoxComp : IComparer<Box>
{
    // Compares by Height, Length, and Width.
    public int Compare(Box x, Box y)
    {
        if (x.Height.CompareTo(y.Height) != 0)
        {
            return x.Height.CompareTo(y.Height);
        }
        else if (x.Length.CompareTo(y.Length) != 0)
        {
            return x.Length.CompareTo(y.Length);
        }
        else if (x.Width.CompareTo(y.Width) != 0)
        {
            return x.Width.CompareTo(y.Width);
        }
        else
        {
            return 0;
        }
    }
}

public class Box : IComparable<Box>
{

    public Box(int h, int l, int w)
    {
        this.Height = h;
        this.Length = l;
        this.Width = w;
    }
    public int Height { get; private set; }
    public int Length { get; private set; }
    public int Width { get; private set; }

    public int CompareTo(Box other)
    {
        // Compares Height, Length, and Width.
        if (this.Height.CompareTo(other.Height) != 0)
        {
            return this.Height.CompareTo(other.Height);
        }
        else if (this.Length.CompareTo(other.Length) != 0)
        {
            return this.Length.CompareTo(other.Length);
        }
        else if (this.Width.CompareTo(other.Width) != 0)
        {
            return this.Width.CompareTo(other.Width);
        }
        else
        {
            return 0;
        }
    }

}

Imports System.Collections.Generic

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim Boxes As New List(Of Box)()
		Boxes.Add(New Box(4, 20, 14))
		Boxes.Add(New Box(12, 12, 12))
		Boxes.Add(New Box(8, 20, 10))
		Boxes.Add(New Box(6, 10, 2))
		Boxes.Add(New Box(2, 8, 4))
		Boxes.Add(New Box(2, 6, 8))
		Boxes.Add(New Box(4, 12, 20))
		Boxes.Add(New Box(18, 10, 4))
		Boxes.Add(New Box(24, 4, 18))
		Boxes.Add(New Box(10, 4, 16))
		Boxes.Add(New Box(10, 2, 10))
		Boxes.Add(New Box(6, 18, 2))
		Boxes.Add(New Box(8, 12, 4))
		Boxes.Add(New Box(12, 10, 8))
		Boxes.Add(New Box(14, 6, 6))
		Boxes.Add(New Box(16, 6, 16))
		Boxes.Add(New Box(2, 8, 12))
		Boxes.Add(New Box(4, 24, 8))
		Boxes.Add(New Box(8, 6, 20))
		Boxes.Add(New Box(18, 18, 12))

		' Sort by an Comparer<T> implementation that sorts
		' first by the length.
		Boxes.Sort(New BoxLengthFirst())

		Console.WriteLine("H - L - W")
		Console.WriteLine("==========")
		For Each bx As Box In Boxes
            Console.WriteLine("{0}" & vbTab & "{1}" & vbTab & "{2}", _
                              bx.Height.ToString(), bx.Length.ToString(), _
                              bx.Width.ToString())
		Next bx

		Console.WriteLine()
		Console.WriteLine("H - L - W")
		Console.WriteLine("==========")

		' Get the default comparer that 
		' sorts first by the height.
		Dim defComp As Comparer(Of Box) = Comparer(Of Box).Default

		' Calling Boxes.Sort() with no parameter
		' is the same as calling Boxs.Sort(defComp)
		' because they are both using the default comparer.
		Boxes.Sort()

		For Each bx As Box In Boxes
            Console.WriteLine("{0}" & vbTab & "{1}" & vbTab & "{2}", _
                              bx.Height.ToString(), _
                              bx.Length.ToString(), _
                              bx.Width.ToString())
		Next bx


		' This explicit interface implementation
		' compares first by the length.
		' Returns -1 because the length of BoxA
		' is less than the length of BoxB.
		Dim LengthFirst As New BoxLengthFirst()

		Dim bc As Comparer(Of Box) = CType(LengthFirst, Comparer(Of Box))

		Dim BoxA As New Box(2, 6, 8)
		Dim BoxB As New Box(10, 12, 14)
		Dim x As Integer = LengthFirst.Compare(BoxA, BoxB)
		Console.WriteLine()
		Console.WriteLine(x.ToString())



	End Sub

End Class

Public Class BoxLengthFirst
	Inherits Comparer(Of Box)
	' Compares by Length, Height, and Width.
	Public Overrides Function Compare(ByVal x As Box, ByVal y As Box) As Integer
		If x.Length.CompareTo(y.Length) <> 0 Then
			Return x.Length.CompareTo(y.Length)
		ElseIf x.Height.CompareTo(y.Height) <> 0 Then
			Return x.Height.CompareTo(y.Height)
		ElseIf x.Width.CompareTo(y.Width) <> 0 Then
			Return x.Width.CompareTo(y.Width)
		Else
			Return 0
		End If
	End Function

End Class

' This class is not demonstrated in the Main method
' and is provided only to show how to implement
' the interface. It is recommended to derive
' from Comparer<T> instead of implementing IComparer<T>.
Public Class BoxComp
	Implements IComparer(Of Box)
	' Compares by Height, Length, and Width.
    Public Function Compare(ByVal x As Box, ByVal y As Box) As Integer Implements _
                                                IComparer(Of Box).Compare
        If x.Height.CompareTo(y.Height) <> 0 Then
            Return x.Height.CompareTo(y.Height)
        ElseIf x.Length.CompareTo(y.Length) <> 0 Then
            Return x.Length.CompareTo(y.Length)
        ElseIf x.Width.CompareTo(y.Width) <> 0 Then
            Return x.Width.CompareTo(y.Width)
        Else
            Return 0
        End If
    End Function
End Class

Public Class Box
	Implements IComparable(Of Box)

	Public Sub New(ByVal h As Integer, ByVal l As Integer, ByVal w As Integer)
		Me.Height = h
		Me.Length = l
		Me.Width = w
	End Sub
	Private privateHeight As Integer
	Public Property Height() As Integer
		Get
			Return privateHeight
		End Get
		Private Set(ByVal value As Integer)
			privateHeight = value
		End Set
	End Property
	Private privateLength As Integer
	Public Property Length() As Integer
		Get
			Return privateLength
		End Get
		Private Set(ByVal value As Integer)
			privateLength = value
		End Set
	End Property
	Private privateWidth As Integer
	Public Property Width() As Integer
		Get
			Return privateWidth
		End Get
		Private Set(ByVal value As Integer)
			privateWidth = value
		End Set
	End Property

    Public Function CompareTo(ByVal other As Box) As Integer _
                        Implements IComparable(Of Box).CompareTo
        ' Compares Height, Length, and Width.
        If Me.Height.CompareTo(other.Height) <> 0 Then
            Return Me.Height.CompareTo(other.Height)
        ElseIf Me.Length.CompareTo(other.Length) <> 0 Then
            Return Me.Length.CompareTo(other.Length)
        ElseIf Me.Width.CompareTo(other.Width) <> 0 Then
            Return Me.Width.CompareTo(other.Width)
        Else
            Return 0
        End If
    End Function

End Class

Hinweise

Leiten Sie von dieser Klasse, um eine benutzerdefinierte Implementierung bieten die IComparer<T> Schnittstelle für die Verwendung mit Auflistungsklassen, z. B. die SortedList<TKey,TValue> und SortedDictionary<TKey,TValue> generischen Klassen.Derive from this class to provide a custom implementation of the IComparer<T> interface for use with collection classes such as the SortedList<TKey,TValue> and SortedDictionary<TKey,TValue> generic classes.

Der Unterschied zwischen der Ableitung von der Comparer<T> -Klasse und Implementieren der System.IComparable Schnittstelle lautet wie folgt:The difference between deriving from the Comparer<T> class and implementing the System.IComparable interface is as follows:

  • An wie die beiden Objekte standardmäßig verglichen werden soll, implementieren die System.IComparable Schnittstelle in Ihrer Klasse.To specify how two objects should be compared by default, implement the System.IComparable interface in your class. Dadurch wird sichergestellt, dass Sortiervorgänge den Standardcode für den Vergleich verwendet, den Sie angegeben haben.This ensures that sort operations will use the default comparison code that you provided.

  • Um einen Vergleich, statt die standardmäßige Vergleichsfunktion verwendet zu definieren, leiten Sie von der Comparer<T> Klasse.To define a comparer to use instead of the default comparer, derive from the Comparer<T> class. Klicken Sie dann können dieses Vergleichs in Sortiervorgänge, die einen Vergleich als Parameter annehmen.You can then use this comparer in sort operations that take a comparer as a parameter.

Das von zurückgegebene Objekt der Default Eigenschaft verwendet die System.IComparable<T> generische Schnittstelle (IComparable<T> in c# IComparable(Of T) in Visual Basic) vergleicht zwei Objekte.The object returned by the Default property uses the System.IComparable<T> generic interface (IComparable<T> in C#, IComparable(Of T) in Visual Basic) to compare two objects. Wenn Typ T implementiert nicht die System.IComparable<T> generische Schnittstelle, die Default -Eigenschaft gibt eine Comparer<T> , verwendet der System.IComparable Schnittstelle.If type T does not implement the System.IComparable<T> generic interface, the Default property returns a Comparer<T> that uses the System.IComparable interface.

Hinweise für Vererber

System.Collections.Generic.Comparer`1.Compare(`0,\`0) und System.Collections.Generic.EqualityComparer`1.Equals(`0,\`0) verhält sich möglicherweise anders in Bezug auf die Berücksichtigung von Kultur und Groß-/Kleinschreibung. System.Collections.Generic.Comparer`1.Compare(`0,\`0) and System.Collections.Generic.EqualityComparer`1.Equals(`0,\`0) may behave differently in terms of culture-sensitivity and case-sensitivity.

Für Vergleiche von Zeichenfolgen die StringComparer Klasse vorzuziehen ist Comparer<Zeichenfolge>.For string comparisons, the StringComparer class is recommended over Comparer<String>. Eigenschaften der StringComparer Klasse zurückgeben, vordefinierte Instanzen, die Zeichenfolgenvergleiche mit verschiedenen Kombinationen der Berücksichtigung von Kultur und Groß-/Kleinschreibung durchzuführen.Properties of the StringComparer class return predefined instances that perform string comparisons with different combinations of culture-sensitivity and case-sensitivity. Die Groß-/Kleinschreibung und der Berücksichtigung von Kultur entsprechen der Elemente des gleichen StringComparer Instanz.The case-sensitivity and culture-sensitivity are consistent among the members of the same StringComparer instance.

Weitere Informationen zu kulturabhängige Vergleiche, finden Sie unter den System.Globalization Namespace und Globalisierung und Lokalisierung.For more information on culture-specific comparisons, see the System.Globalization namespace and Globalization and Localization.

Konstruktoren

Comparer<T>() Comparer<T>() Comparer<T>() Comparer<T>()

Initialisiert eine neue Instanz der Comparer<T>-Klasse.Initializes a new instance of the Comparer<T> class.

Eigenschaften

Default Default Default Default

Gibt für den vom generischen Argument angegebenen Typ einen Standardvergleich für die Sortierreihenfolgen zurück.Returns a default sort order comparer for the type specified by the generic argument.

Methoden

Compare(T, T) Compare(T, T) Compare(T, T) Compare(T, T)

Vergleicht beim Überschreiben in einer abgeleiteten Klasse zwei Objekte gleichen Typs und gibt über den zurückgegebenen Wert an, ob das eine Objekt kleiner, größer oder gleich dem anderen Objekt ist.When overridden in a derived class, performs a comparison of two objects of the same type and returns a value indicating whether one object is less than, equal to, or greater than the other.

Create(Comparison<T>) Create(Comparison<T>) Create(Comparison<T>) Create(Comparison<T>)

Erstellt mithilfe des angegebenen Vergleichs einen Vergleich.Creates a comparer by using the specified comparison.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Bestimmt, ob das angegebene Objekt mit dem aktuellen Objekt identisch ist.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Fungiert als Standardhashfunktion.Serves as the default hash function.

(Inherited from Object)
GetType() GetType() GetType() GetType()

Ruft den Type der aktuellen Instanz ab.Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.Returns a string that represents the current object.

(Inherited from Object)

Explizite Schnittstellenimplementierungen

IComparer.Compare(Object, Object) IComparer.Compare(Object, Object) IComparer.Compare(Object, Object) IComparer.Compare(Object, Object)

Vergleicht zwei Objekte und gibt einen Wert zurück, der angibt, ob ein Wert niedriger, gleich oder größer als der andere Wert ist.Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other.

Gilt für:

Siehe auch