Export (0) Print
Expand All

List(Of T).TrimExcess Method

Sets the capacity to the actual number of elements in the List(Of T), if that number is less than a threshold value.

Namespace:  System.Collections.Generic
Assembly:  mscorlib (in mscorlib.dll)

'Declaration
Public Sub TrimExcess

This method can be used to minimize a collection's memory overhead if no new elements will be added to the collection. The cost of reallocating and copying a large List(Of T) can be considerable, however, so the TrimExcess method does nothing if the list is at more than 90 percent of capacity. This avoids incurring a large reallocation cost for a relatively small gain.

NoteNote

The current threshold of 90 percent might change in future releases.

This method is an O(n) operation, where n is Count.

To reset a List(Of T) to its initial state, call the Clear method before calling the TrimExcess method. Trimming an empty List(Of T) sets the capacity of the List(Of T) to the default capacity.

The capacity can also be set using the Capacity property.

The following example demonstrates how to check the capacity and count of a List(Of T) that contains a simple business object, and illustrates using the TrimExcess method to remove extra capacity.

Imports System.Collections.Generic
' Simple business object. A PartId is used to identify a part  
' but the part name can change. 
Public Class Part
    Implements IEquatable(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 Overrides Function GetHashCode() As Integer 
        Return MyBase.GetHashCode()
    End Function 
    Public Overloads Function Equals(other As Part) As Boolean Implements IEquatable(Of 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()
        Dim parts As New List(Of Part)()

        Console.WriteLine(vbLf & "Capacity: {0}", parts.Capacity)

        ' Add parts to the list.
        parts.Add(New Part() With { _
             .PartName = "crank arm", _
             .PartId = 1234 _
        })
        parts.Add(New Part() With { _
             .PartName = "chain ring", _
             .PartId = 1334 _
        })
        parts.Add(New Part() With { _
             .PartName = "regular seat", _
             .PartId = 1434 _
        })
        parts.Add(New Part() With { _
             .PartName = "banana seat", _
             .PartId = 1444 _
        })
        parts.Add(New Part() With { _
             .PartName = "cassette", _
             .PartId = 1534 _
        })
        parts.Add(New Part() With { _
             .PartName = "shift lever", _
             .PartId = 1634 _
        })



        Console.WriteLine()
        For Each aPart As Part In parts
            Console.WriteLine(aPart)
        Next

        Console.WriteLine(vbLf & "Capacity: {0}", parts.Capacity)
        Console.WriteLine("Count: {0}", parts.Count)

        parts.TrimExcess()
        Console.WriteLine(vbLf & "TrimExcess()")
        Console.WriteLine("Capacity: {0}", parts.Capacity)
        Console.WriteLine("Count: {0}", parts.Count)

        parts.Clear()
        Console.WriteLine(vbLf & "Clear()")
        Console.WriteLine("Capacity: {0}", parts.Capacity)
        Console.WriteLine("Count: {0}", parts.Count)
    End Sub 
    
    '     This code example produces the following output.  
    '            Capacity: 0 
    
    '            ID: 1234   Name: crank arm 
    '            ID: 1334   Name: chain ring 
    '            ID: 1434   Name: seat 
    '            ID: 1534   Name: cassette 
    '            ID: 1634   Name: shift lever 
    
    '            Capacity: 8 
    '            Count: 6 
    
    '            TrimExcess() 
    '            Capacity: 6 
    '            Count: 6 
    
    '            Clear() 
    '            Capacity: 6 
    '            Count: 0 
    '      

End Class

The following example demonstrates the TrimExcess method. Several properties and methods of the List(Of T) class are used to add, insert, and remove items from a list of strings. Then the TrimExcess method is used to reduce the capacity to match the count, and the Capacity and Count properties are displayed. If the unused capacity had been less than 10 percent of total capacity, the list would not have been resized. Finally, the contents of the list are cleared.

Imports System
Imports System.Collections.Generic

Public Class Example

    Public Shared Sub Main()
        Dim dinosaurs As New List(Of String)

        Console.WriteLine(vbLf & "Capacity: {0}", dinosaurs.Capacity)

        dinosaurs.Add("Tyrannosaurus")
        dinosaurs.Add("Amargasaurus")
        dinosaurs.Add("Mamenchisaurus")
        dinosaurs.Add("Deinonychus")
        dinosaurs.Add("Compsognathus")

        Console.WriteLine()
        For Each dinosaur As String In dinosaurs
            Console.WriteLine(dinosaur)
        Next

        Console.WriteLine(vbLf & "Capacity: {0}", dinosaurs.Capacity)
        Console.WriteLine("Count: {0}", dinosaurs.Count)

        Console.WriteLine(vbLf & "Contains(""Deinonychus""): {0}", _
            dinosaurs.Contains("Deinonychus"))

        Console.WriteLine(vbLf & "Insert(2, ""Compsognathus"")")
        dinosaurs.Insert(2, "Compsognathus")

        Console.WriteLine()
        For Each dinosaur As String In dinosaurs
            Console.WriteLine(dinosaur)
        Next 
        ' Shows how to access the list using the Item property.
        Console.WriteLine(vbLf & "dinosaurs(3): {0}", dinosaurs(3))
        Console.WriteLine(vbLf & "Remove(""Compsognathus"")")
        dinosaurs.Remove("Compsognathus")

        Console.WriteLine()
        For Each dinosaur As String In dinosaurs
            Console.WriteLine(dinosaur)
        Next

        dinosaurs.TrimExcess()
        Console.WriteLine(vbLf & "TrimExcess()")
        Console.WriteLine("Capacity: {0}", dinosaurs.Capacity)
        Console.WriteLine("Count: {0}", dinosaurs.Count)

        dinosaurs.Clear()
        Console.WriteLine(vbLf & "Clear()")
        Console.WriteLine("Capacity: {0}", dinosaurs.Capacity)
        Console.WriteLine("Count: {0}", dinosaurs.Count)
    End Sub 
End Class 

' This code example produces the following output: 

'Capacity: 0 

'Tyrannosaurus 
'Amargasaurus 
'Mamenchisaurus 
'Deinonychus 
'Compsognathus 

'Capacity: 8 
'Count: 5 

'Contains("Deinonychus"): True 

'Insert(2, "Compsognathus") 

'Tyrannosaurus 
'Amargasaurus 
'Compsognathus 
'Mamenchisaurus 
'Deinonychus 
'Compsognathus 

'dinosaurs(3): Mamenchisaurus 

'Remove("Compsognathus") 

'Tyrannosaurus 
'Amargasaurus 
'Mamenchisaurus 
'Deinonychus 
'Compsognathus 

'TrimExcess() 
'Capacity: 5 
'Count: 5 

'Clear() 
'Capacity: 5 
'Count: 0

.NET Framework

Supported in: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Portable Class Library

Supported in: Portable Class Library

.NET for Windows Store apps

Supported in: Windows 8

.NET for Windows Phone apps

Supported in: Windows Phone 8.1, Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core Role not supported), Windows Server 2008 R2 (Server Core Role supported with SP1 or later; Itanium not supported)

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

Show:
© 2014 Microsoft