# Comparison<T> 委托

## 定义

``````generic <typename T>
public delegate int Comparison(T x, T y);``````
``public delegate int Comparison<in T>(T x, T y);``
``public delegate int Comparison<T>(T x, T y);``
``type Comparison<'T> = delegate of 'T * 'T -> int``
``Public Delegate Function Comparison(Of In T)(x As T, y As T) As Integer ``
``Public Delegate Function Comparison(Of T)(x As T, y As T) As Integer ``

T

x
T

y
T

#### 返回值

Int32

Value 含义Meaning

00 `x` 等于 `y``x` equals `y`.

## 示例

List<T>将创建一个字符串，并以无特定顺序填充四个字符串。A List<T> of strings is created and populated with four strings, in no particular order. 此列表还包括一个空字符串和一个空引用。The list also includes an empty string and a null reference. 显示列表，使用 Comparison<T> 表示方法的泛型委托 `CompareDinosByLength` 进行排序，并再次显示。The list is displayed, sorted using a Comparison<T> generic delegate representing the `CompareDinosByLength` method, and displayed again.

``````using namespace System;
using namespace System::Collections::Generic;

int CompareDinosByLength(String^ x, String^ y)
{
if (x == nullptr)
{
if (y == nullptr)
{
// If x is null and y is null, they're
// equal.
return 0;
}
else
{
// If x is null and y is not null, y
// is greater.
return -1;
}
}
else
{
// If x is not null...
//
if (y == nullptr)
// ...and y is null, x is greater.
{
return 1;
}
else
{
// ...and y is not null, compare the
// lengths of the two strings.
//
int retval = x->Length.CompareTo(y->Length);

if (retval != 0)
{
// If the strings are not of equal length,
// the longer string is greater.
//
return retval;
}
else
{
// If the strings are of equal length,
// sort them with ordinary string comparison.
//
return x->CompareTo(y);
}
}
}
};

void Display(List<String^>^ list)
{
Console::WriteLine();
for each(String^ s in list)
{
if (s == nullptr)
Console::WriteLine("(null)");
else
Console::WriteLine("\"{0}\"", s);
}
};

void main()
{
List<String^>^ dinosaurs = gcnew List<String^>();
Display(dinosaurs);

Console::WriteLine("\nSort with generic Comparison<String^> delegate:");
dinosaurs->Sort(
gcnew Comparison<String^>(CompareDinosByLength));
Display(dinosaurs);

}

/* This code example produces the following output:

"Pachycephalosaurus"
"Amargasaurus"
""
(null)
"Mamenchisaurus"
"Deinonychus"

Sort with generic Comparison<String^> delegate:

(null)
""
"Deinonychus"
"Amargasaurus"
"Mamenchisaurus"
"Pachycephalosaurus"
*/
``````
``````using System;
using System.Collections.Generic;

public class Example
{
private static int CompareDinosByLength(string x, string y)
{
if (x == null)
{
if (y == null)
{
// If x is null and y is null, they're
// equal.
return 0;
}
else
{
// If x is null and y is not null, y
// is greater.
return -1;
}
}
else
{
// If x is not null...
//
if (y == null)
// ...and y is null, x is greater.
{
return 1;
}
else
{
// ...and y is not null, compare the
// lengths of the two strings.
//
int retval = x.Length.CompareTo(y.Length);

if (retval != 0)
{
// If the strings are not of equal length,
// the longer string is greater.
//
return retval;
}
else
{
// If the strings are of equal length,
// sort them with ordinary string comparison.
//
return x.CompareTo(y);
}
}
}
}

public static void Main()
{
List<string> dinosaurs = new List<string>();
Display(dinosaurs);

Console.WriteLine("\nSort with generic Comparison<string> delegate:");
dinosaurs.Sort(CompareDinosByLength);
Display(dinosaurs);
}

private static void Display(List<string> list)
{
Console.WriteLine();
foreach( string s in list )
{
if (s == null)
Console.WriteLine("(null)");
else
Console.WriteLine("\"{0}\"", s);
}
}
}

/* This code example produces the following output:

"Pachycephalosaurus"
"Amargasaurus"
""
(null)
"Mamenchisaurus"
"Deinonychus"

Sort with generic Comparison<string> delegate:

(null)
""
"Deinonychus"
"Amargasaurus"
"Mamenchisaurus"
"Pachycephalosaurus"
*/
``````
``````Imports System.Collections.Generic

Public Class Example

Private Shared Function CompareDinosByLength( _
ByVal x As String, ByVal y As String) As Integer

If x Is Nothing Then
If y Is Nothing Then
' If x is Nothing and y is Nothing, they're
' equal.
Return 0
Else
' If x is Nothing and y is not Nothing, y
' is greater.
Return -1
End If
Else
' If x is not Nothing...
'
If y Is Nothing Then
' ...and y is Nothing, x is greater.
Return 1
Else
' ...and y is not Nothing, compare the
' lengths of the two strings.
'
Dim retval As Integer = _
x.Length.CompareTo(y.Length)

If retval <> 0 Then
' If the strings are not of equal length,
' the longer string is greater.
'
Return retval
Else
' If the strings are of equal length,
' sort them with ordinary string comparison.
'
Return x.CompareTo(y)
End If
End If
End If

End Function

Public Shared Sub Main()

Dim dinosaurs As New List(Of String)
Display(dinosaurs)

Console.WriteLine(vbLf & "Sort with generic Comparison(Of String) delegate:")
Display(dinosaurs)

End Sub

Private Shared Sub Display(ByVal lis As List(Of String))
Console.WriteLine()
For Each s As String In lis
If s Is Nothing Then
Console.WriteLine("(Nothing)")
Else
Console.WriteLine("""{0}""", s)
End If
Next
End Sub
End Class

' This code example produces the following output:
'
'"Pachycephalosaurus"
'"Amargasaurus"
'""
'(Nothing)
'"Mamenchisaurus"
'"Deinonychus"
'
'Sort with generic Comparison(Of String) delegate:
'
'(Nothing)
'""
'"Deinonychus"
'"Amargasaurus"
'"Mamenchisaurus"
'"Pachycephalosaurus"
``````

``````using System;

public class CityInfo
{
string cityName;
string countryName;
int pop2010;

public CityInfo(string name, string country, int pop2010)
{
this.cityName = name;
this.countryName = country;
this.pop2010 = pop2010;
}

public string City
{ get { return this.cityName; } }

public string Country
{ get { return this.countryName; } }

public int Population
{ get { return this.pop2010; } }

public static int CompareByName(CityInfo city1, CityInfo city2)
{
return String.Compare(city1.City, city2.City);
}

public static int CompareByPopulation(CityInfo city1, CityInfo city2)
{
return city1.Population.CompareTo(city2.Population);
}

public static int CompareByNames(CityInfo city1, CityInfo city2)
{
return String.Compare(city1.Country + city1.City, city2.Country + city2.City);
}
}

public class Example
{
public static void Main()
{
CityInfo NYC = new CityInfo("New York City", "United States of America", 8175133 );
CityInfo Det = new CityInfo("Detroit", "United States of America", 713777);
CityInfo Paris = new CityInfo("Paris", "France",  2193031);
CityInfo[] cities = { NYC, Det, Paris };
// Display ordered array.
DisplayArray(cities);

// Sort array by city name.
Array.Sort(cities, CityInfo.CompareByName);
DisplayArray(cities);

// Sort array by population.
Array.Sort(cities, CityInfo.CompareByPopulation);
DisplayArray(cities);

// Sort array by country + city name.
Array.Sort(cities, CityInfo.CompareByNames);
DisplayArray(cities);
}

private static void DisplayArray(CityInfo[] cities)
{
Console.WriteLine("{0,-20} {1,-25} {2,10}", "City", "Country", "Population");
foreach (var city in cities)
Console.WriteLine("{0,-20} {1,-25} {2,10:N0}", city.City,
city.Country, city.Population);

Console.WriteLine();
}
}
// The example displays the following output:
//     City                 Country                   Population
//     New York City        United States of America   8,175,133
//     Detroit              United States of America     713,777
//     Paris                France                     2,193,031
//
//     City                 Country                   Population
//     Detroit              United States of America     713,777
//     New York City        United States of America   8,175,133
//     Paris                France                     2,193,031
//
//     City                 Country                   Population
//     Detroit              United States of America     713,777
//     Paris                France                     2,193,031
//     New York City        United States of America   8,175,133
//
//     City                 Country                   Population
//     Paris                France                     2,193,031
//     Detroit              United States of America     713,777
//     New York City        United States of America   8,175,133
``````
``````Public Class CityInfo
Dim cityName As String
Dim countryName As String
Dim pop2010 As Integer

Public Sub New(name As String, country As String, pop2010 As Integer)
Me.cityName = name
Me.countryName = country
Me.pop2010 = pop2010
End Sub

Public ReadOnly Property City As String
Get
Return Me.cityName
End Get
End Property

Public ReadOnly Property Country As String
Get
Return Me.countryName
End Get
End Property

Public ReadOnly Property Population As Integer
Get
Return Me.pop2010
End Get
End Property

Public Shared Function CompareByName(city1 As CityInfo, city2 As CityInfo) As Integer
Return String.Compare(city1.City, city2.City)
End Function

Public Shared Function CompareByPopulation(city1 As CityInfo, city2 As CityInfo) As Integer
Return city1.Population.CompareTo(city2.Population)
End Function

Public Shared Function CompareByNames(city1 As CityInfo, city2 As CityInfo) As Integer
Return String.Compare(city1.Country + city1.City, city2.Country + city2.City)
End Function
End Class

Module Example
Public Sub Main()
Dim NYC As New CityInfo("New York City", "United States of America", 8175133)
Dim Det As New CityInfo("Detroit", "United States of America", 713777)
Dim Paris As New CityInfo("Paris", "France", 2193031)
Dim cities As CityInfo() = { NYC, Det, Paris }
' Display ordered array.
DisplayArray(cities)

' Sort array by city name.
DisplayArray(cities)

' Sort array by population.
DisplayArray(cities)

' Sort array by country + city name.
DisplayArray(cities)
End Sub

Private Sub DisplayArray(cities() As CityInfo)
Console.WriteLine("{0,-20} {1,-25} {2,10}", "City", "Country/Region", "Population")
For Each city In cities
Console.WriteLine("{0,-20} {1,-25} {2,10:N0}", city.City, city.Country, city.Population)
Next
Console.WriteLine()
End Sub
End Module
' The example displays the following output:
'     City                 Country/Region            Population
'     New York City        United States of America   8,175,133
'     Detroit              United States of America     713,777
'     Paris                France                     2,193,031
'
'     City                 Country/Region            Population
'     Detroit              United States of America     713,777
'     New York City        United States of America   8,175,133
'     Paris                France                     2,193,031
'
'     City                 Country/Region            Population
'     Detroit              United States of America     713,777
'     Paris                France                     2,193,031
'     New York City        United States of America   8,175,133
'
'     City                 Country/Region            Population
'     Paris                France                     2,193,031
'     Detroit              United States of America     713,777
'     New York City        United States of America   8,175,133
``````

## 注解

Sort<T>(T[], Comparison<T>)该类的方法重载以及类的方法重载使用此委托对 Array Sort(Comparison<T>) List<T> 数组或列表的元素进行排序。This delegate is used by the Sort<T>(T[], Comparison<T>) method overload of the Array class and the Sort(Comparison<T>) method overload of the List<T> class to sort the elements of an array or list.

## 扩展方法

 获取指示指定委托表示的方法的对象。Gets an object that represents the method represented by the specified delegate.