# Comparison<T>Comparison<T>Comparison<T>Comparison<T> Delegate

## 定義

``````generic <typename T>
public delegate int Comparison(T x, T y);``````
``public delegate int Comparison<in 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 ``

T

x

y

#### 傳回值

System.Int32

Value 意義Meaning

00 `x`等於 `y``x` equals `y`.

Comparison<T>Comparison<T>Comparison<T>Comparison<T>

## 範例

AList<T>的字串會建立並填入具有四個字串，不依特定順序。A List<T> of strings is created and populated with four strings, in no particular order. 清單也會包含空字串和 null 參考。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
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
``````

## 擴充方法

 GetMethodInfo(Delegate) GetMethodInfo(Delegate) GetMethodInfo(Delegate) GetMethodInfo(Delegate) 取得表示特定委派所代表之方法的物件。Gets an object that represents the method represented by the specified delegate.