# 在集合內比較和排序Comparisons and Sorts Within Collections

System.Collections 類別幾乎會在管理集合內的所有處理序中執行比較，包含搜尋要移除的項目，或傳回成對的索引鍵與值。The System.Collections classes perform comparisons in almost all the processes involved in managing collections, whether searching for the element to remove or returning the value of a key-and-value pair.

## 相等和排序範例Equality and sort example

using System;
using System.Collections.Generic;
// Simple business object. A PartId is used to identify the type of part
// but the part name can change.
public class Part : IEquatable<Part> , IComparable<Part>
{
public string PartName { get; set; }

public int PartId { get; set; }

public override string ToString()
{
return "ID: " + PartId + "   Name: " + PartName;
}
public override bool Equals(object obj)
{
if (obj == null) return false;
Part objAsPart = obj as Part;
if (objAsPart == null) return false;
else return Equals(objAsPart);
}
public int SortByNameAscending(string name1, string name2)
{

return name1.CompareTo(name2);
}

// Default comparer for Part type.
public int CompareTo(Part comparePart)
{
// A null value means that this object is greater.
if (comparePart == null)
return 1;

else
return this.PartId.CompareTo(comparePart.PartId);
}
public override int GetHashCode()
{
return PartId;
}
public bool Equals(Part other)
{
if (other == null) return false;
return (this.PartId.Equals(other.PartId));
}
// Should also override == and != operators.

}
public class Example
{
public static void Main()
{
// Create a list of parts.
List<Part> parts = new List<Part>();

// Add parts to the list.
parts.Add(new Part() { PartName = "regular seat", PartId = 1434 });
parts.Add(new Part() { PartName= "crank arm", PartId = 1234 });
parts.Add(new Part() { PartName = "shift lever", PartId = 1634 }); ;
// Name intentionally left null.
parts.Add(new Part() {  PartId = 1334 });
parts.Add(new Part() { PartName = "banana seat", PartId = 1444 });
parts.Add(new Part() { PartName = "cassette", PartId = 1534 });

// Write out the parts in the list. This will call the overridden
// ToString method in the Part class.
Console.WriteLine("\nBefore sort:");
foreach (Part aPart in parts)
{
Console.WriteLine(aPart);
}

// Call Sort on the list. This will use the
// default comparer, which is the Compare method
// implemented on Part.
parts.Sort();

Console.WriteLine("\nAfter sort by part number:");
foreach (Part aPart in parts)
{
Console.WriteLine(aPart);
}

// This shows calling the Sort(Comparison(T) overload using
// an anonymous method for the Comparison delegate.
// This method treats null as the lesser of two values.
parts.Sort(delegate(Part x, Part y)
{
if (x.PartName == null && y.PartName == null) return 0;
else if (x.PartName == null) return -1;
else if (y.PartName == null) return 1;
else return x.PartName.CompareTo(y.PartName);
});

Console.WriteLine("\nAfter sort by name:");
foreach (Part aPart in parts)
{
Console.WriteLine(aPart);
}

/*

Before sort:
ID: 1434   Name: regular seat
ID: 1234   Name: crank arm
ID: 1634   Name: shift lever
ID: 1334   Name:
ID: 1444   Name: banana seat
ID: 1534   Name: cassette

After sort by part number:
ID: 1234   Name: crank arm
ID: 1334   Name:
ID: 1434   Name: regular seat
ID: 1444   Name: banana seat
ID: 1534   Name: cassette
ID: 1634   Name: shift lever

After sort by name:
ID: 1334   Name:
ID: 1444   Name: banana seat
ID: 1534   Name: cassette
ID: 1234   Name: crank arm
ID: 1434   Name: regular seat
ID: 1634   Name: shift lever

*/

}
}

Imports System.Collections.Generic

' Simple business object. A PartId is used to identify the type of part
' but the part name can change.
Public Class Part
Implements IEquatable(Of Part)
Implements IComparable(Of Part)
Public Property PartName() As String
Get
Return m_PartName
End Get
Set(value As String)
m_PartName = Value
End Set
End Property
Private m_PartName As String

Public Property PartId() As Integer
Get
Return m_PartId
End Get
Set(value As Integer)
m_PartId = Value
End Set
End Property
Private m_PartId As Integer

Public Overrides Function ToString() As String
Return "ID: " & PartId & "   Name: " & PartName
End Function

Public Overrides Function Equals(obj As Object) As Boolean
If obj Is Nothing Then
Return False
End If
Dim objAsPart As Part = TryCast(obj, Part)
If objAsPart Is Nothing Then
Return False
Else
Return Equals(objAsPart)
End If
End Function

Public Function SortByNameAscending(name1 As String, name2 As String) As Integer

Return name1.CompareTo(name2)
End Function

' Default comparer for Part.
Public Function CompareTo(comparePart As Part) As Integer _
Implements IComparable(Of ListSortVB.Part).CompareTo
' A null value means that this object is greater.
If comparePart Is Nothing Then
Return 1
Else

Return Me.PartId.CompareTo(comparePart.PartId)
End If
End Function
Public Overrides Function GetHashCode() As Integer
Return PartId
End Function
Public Overloads Function Equals(other As Part) As Boolean Implements IEquatable(Of ListSortVB.Part).Equals
If other Is Nothing Then
Return False
End If
Return (Me.PartId.Equals(other.PartId))
End Function
' Should also override == and != operators.

End Class
Public Class Example
Public Shared Sub Main()
' Create a list of parts.
Dim parts As New List(Of Part)()

' Add parts to the list.
.PartName = "regular seat", _
.PartId = 1434 _
})
.PartName = "crank arm", _
.PartId = 1234 _
})
.PartName = "shift lever", _
.PartId = 1634 _
})

' Name intentionally left null.
.PartId = 1334 _
})
.PartName = "banana seat", _
.PartId = 1444 _
})
.PartName = "cassette", _
.PartId = 1534 _
})

' Write out the parts in the list. This will call the overridden
' ToString method in the Part class.
Console.WriteLine(vbLf & "Before sort:")
For Each aPart As Part In parts
Console.WriteLine(aPart)
Next

' Call Sort on the list. This will use the
' default comparer, which is the Compare method
' implemented on Part.
parts.Sort()

Console.WriteLine(vbLf & "After sort by part number:")
For Each aPart As Part In parts
Console.WriteLine(aPart)
Next

' This shows calling the Sort(Comparison(T) overload using
' an anonymous delegate method.
' This method treats null as the lesser of two values.
parts.Sort(Function(x As Part, y As Part)
If x.PartName Is Nothing AndAlso y.PartName Is Nothing Then
Return 0
ElseIf x.PartName Is Nothing Then
Return -1
ElseIf y.PartName Is Nothing Then
Return 1
Else
Return x.PartName.CompareTo(y.PartName)
End If
End Function)

Console.WriteLine(vbLf & "After sort by name:")
For Each aPart As Part In parts
Console.WriteLine(aPart)
Next

'
'
'            Before sort:
'            ID: 1434   Name: regular seat
'            ID: 1234   Name: crank arm
'            ID: 1634   Name: shift lever
'            ID: 1334   Name:
'            ID: 1444   Name: banana seat
'            ID: 1534   Name: cassette
'
'            After sort by part number:
'            ID: 1234   Name: crank arm
'            ID: 1334   Name:
'            ID: 1434   Name: regular seat
'            ID: 1444   Name: banana seat
'            ID: 1534   Name: cassette
'            ID: 1634   Name: shift lever
'
'            After sort by name:
'            ID: 1334   Name:
'            ID: 1444   Name: banana seat
'            ID: 1534   Name: cassette
'            ID: 1234   Name: crank arm
'            ID: 1434   Name: regular seat
'            ID: 1634   Name: shift lever

End Sub
End Class