List(Of T).Sort Method (Comparison(Of T))
Sorts the elements in the entire List(Of T) using the specified System.Comparison(Of T).
Assembly: mscorlib (in mscorlib.dll)
Parameters
- comparison
-
Type:
System.Comparison(Of T)
The System.Comparison(Of T) to use when comparing elements.
| Exception | Condition |
|---|---|
| ArgumentNullException | comparison is null. |
| ArgumentException | The implementation of comparison caused an error during the sort. For example, comparison might not return 0 when comparing an item with itself. |
If comparison is provided, the elements of the List(Of T) are sorted using the method represented by the delegate.
If comparison is null, an ArgumentNullException is thrown.
This method uses Array.Sort, which applies the introspective sort as follows:
If the partition size is fewer than 16 elements, it uses an insertion sort algorithm
If the number of partitions exceeds 2 * LogN, where N is the range of the input array, it uses a Heapsort algorithm.
Otherwise, it uses a Quicksort algorithm.
This implementation performs an unstable sort; that is, if two elements are equal, their order might not be preserved. In contrast, a stable sort preserves the order of elements that are equal.
On average, this method is an O(n log n) operation, where n is Count; in the worst case it is an O(n ^ 2) operation.
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. parts.Add(New Part() With { _ .PartName = "regular seat", _ .PartId = 1434 _ }) parts.Add(New Part() With { _ .PartName = "crank arm", _ .PartId = 1234 _ }) parts.Add(New Part() With { _ .PartName = "shift lever", _ .PartId = 1634 _ }) ' Name intentionally left null. parts.Add(New Part() With { _ .PartId = 1334 _ }) parts.Add(New Part() With { _ .PartName = "banana seat", _ .PartId = 1444 _ }) parts.Add(New Part() With { _ .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
The following example demonstrates the Sort(Comparison(Of T)) method overload.
The example defines an alternative comparison method for strings, named CompareDinosByLength. This method works as follows: First, the comparands are tested for null, and a null reference is treated as less than a non-null. Second, the string lengths are compared, and the longer string is deemed to be greater. Third, if the lengths are equal, ordinary string comparison is used.
A List(Of 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. The list is displayed, sorted using a Comparison(Of T) generic delegate representing the CompareDinosByLength method, and displayed again.
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) dinosaurs.Add("Pachycephalosaurus") dinosaurs.Add("Amargasaurus") dinosaurs.Add("") dinosaurs.Add(Nothing) dinosaurs.Add("Mamenchisaurus") dinosaurs.Add("Deinonychus") Display(dinosaurs) Console.WriteLine(vbLf & "Sort with generic Comparison(Of String) delegate:") dinosaurs.Sort(AddressOf CompareDinosByLength) 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"
Available since 8
.NET Framework
Available since 2.0
Portable Class Library
Supported in: portable .NET platforms
Silverlight
Available since 2.0
Windows Phone Silverlight
Available since 7.0
Windows Phone
Available since 8.1