# List<T>.TrimExcess Метод

## Определение

Задает емкость, равную фактическому числу элементов в списке List<T>, если это число меньше порогового значения.Sets the capacity to the actual number of elements in the List<T>, if that number is less than a threshold value.

``````public:
void TrimExcess();``````
``public void TrimExcess ();``
``member this.TrimExcess : unit -> unit``
``Public Sub TrimExcess ()``

## Примеры

В следующем примере показано, как проверить емкость и количество List<T>, которые содержат простой бизнес-объект, и демонстрирует использование метода TrimExcess для удаления дополнительной емкости.The following example demonstrates how to check the capacity and count of a List<T> that contains a simple business object, and illustrates using the TrimExcess method to remove extra capacity.

``````using System;
using System.Collections.Generic;
// Simple business object. A PartId is used to identify a part
// but the part name be different for the same Id.
public class Part : IEquatable<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 override int GetHashCode()
{
return base.GetHashCode();
}
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()
{
List<Part> parts = new List<Part>();

Console.WriteLine("\nCapacity: {0}", parts.Capacity);

parts.Add(new Part() { PartName = "crank arm", PartId = 1234 });
parts.Add(new Part() { PartName = "chain ring", PartId = 1334 });
parts.Add(new Part() { PartName = "seat", PartId = 1434 });
parts.Add(new Part() { PartName = "cassette", PartId = 1534 });
parts.Add(new Part() { PartName = "shift lever", PartId = 1634 }); ;

Console.WriteLine();
foreach (Part aPart in parts)
{
Console.WriteLine(aPart);
}

Console.WriteLine("\nCapacity: {0}", parts.Capacity);
Console.WriteLine("Count: {0}", parts.Count);

parts.TrimExcess();
Console.WriteLine("\nTrimExcess()");
Console.WriteLine("Capacity: {0}", parts.Capacity);
Console.WriteLine("Count: {0}", parts.Count);

parts.Clear();
Console.WriteLine("\nClear()");
Console.WriteLine("Capacity: {0}", parts.Capacity);
Console.WriteLine("Count: {0}", parts.Count);
}
/*
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: 5

TrimExcess()
Capacity: 5
Count: 5

Clear()
Capacity: 5
Count: 0
*/
}
``````
``````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.
.PartName = "crank arm", _
.PartId = 1234 _
})
.PartName = "chain ring", _
.PartId = 1334 _
})
.PartName = "regular seat", _
.PartId = 1434 _
})
.PartName = "banana seat", _
.PartId = 1444 _
})
.PartName = "cassette", _
.PartId = 1534 _
})
.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
``````

В следующем примере демонстрируется метод TrimExcess.The following example demonstrates the TrimExcess method. Несколько свойств и методов класса List<T> используются для добавления, вставки и удаления элементов из списка строк.Several properties and methods of the List<T> class are used to add, insert, and remove items from a list of strings. Затем используется метод TrimExcess для уменьшения емкости, соответствующей количеству, и отображаются свойства Capacity и Count.Then the TrimExcess method is used to reduce the capacity to match the count, and the Capacity and Count properties are displayed. Если неиспользуемая емкость была меньше 10% от общей емкости, размер списка не изменится.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.

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

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

Console::WriteLine("\nCapacity: {0}", dinosaurs->Capacity);

Console::WriteLine();
for each(String^ dinosaur in dinosaurs )
{
Console::WriteLine(dinosaur);
}

Console::WriteLine("\nCapacity: {0}", dinosaurs->Capacity);
Console::WriteLine("Count: {0}", dinosaurs->Count);

Console::WriteLine("\nContains(\"Deinonychus\"): {0}",
dinosaurs->Contains("Deinonychus"));

Console::WriteLine("\nInsert(2, \"Compsognathus\")");
dinosaurs->Insert(2, "Compsognathus");

Console::WriteLine();
for each(String^ dinosaur in dinosaurs )
{
Console::WriteLine(dinosaur);
}

Console::WriteLine("\ndinosaurs[3]: {0}", dinosaurs[3]);

Console::WriteLine("\nRemove(\"Compsognathus\")");
dinosaurs->Remove("Compsognathus");

Console::WriteLine();
for each(String^ dinosaur in dinosaurs )
{
Console::WriteLine(dinosaur);
}

dinosaurs->TrimExcess();
Console::WriteLine("\nTrimExcess()");
Console::WriteLine("Capacity: {0}", dinosaurs->Capacity);
Console::WriteLine("Count: {0}", dinosaurs->Count);

dinosaurs->Clear();
Console::WriteLine("\nClear()");
Console::WriteLine("Capacity: {0}", dinosaurs->Capacity);
Console::WriteLine("Count: {0}", dinosaurs->Count);
}

/* 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
*/
``````
``````List<string> dinosaurs = new List<string>();

Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);

Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}

Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);
Console.WriteLine("Count: {0}", dinosaurs.Count);

Console.WriteLine("\nContains(\"Deinonychus\"): {0}",
dinosaurs.Contains("Deinonychus"));

Console.WriteLine("\nInsert(2, \"Compsognathus\")");
dinosaurs.Insert(2, "Compsognathus");

Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}

// Shows accessing the list using the Item property.
Console.WriteLine("\ndinosaurs[3]: {0}", dinosaurs[3]);

Console.WriteLine("\nRemove(\"Compsognathus\")");
dinosaurs.Remove("Compsognathus");

Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}

dinosaurs.TrimExcess();
Console.WriteLine("\nTrimExcess()");
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
Console.WriteLine("Count: {0}", dinosaurs.Count);

dinosaurs.Clear();
Console.WriteLine("\nClear()");
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
Console.WriteLine("Count: {0}", dinosaurs.Count);

/* 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
*/
``````
``````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)

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
``````
``````
[<EntryPoint>]
let main argv =
// We refer to System.Collections.Generic.List<'T> by its type
// abbreviation ResizeArray<'T> to avoid conflict with the List module.
// Note: In F# code, F# linked lists are usually preferred over
// ResizeArray<'T> when an extendable collection is required.
let dinosaurs = ResizeArray<_>()

// Write out the dinosaurs in the ResizeArray.
let printDinosaurs() =
printfn ""
dinosaurs |> Seq.iter (fun p -> printfn "%O" p)

printfn "\nCapacity: %i" dinosaurs.Capacity

printDinosaurs()

printfn "\nCapacity: %i" dinosaurs.Capacity
printfn "Count: %i" dinosaurs.Count

printfn "\nContains(\"Deinonychus\"): %b" (dinosaurs.Contains("Deinonychus"))

printfn "\nInsert(2, \"Compsognathus\")"
dinosaurs.Insert(2, "Compsognathus")

printDinosaurs()

// Shows accessing the list using the Item property.
printfn "\ndinosaurs[3]: %s" dinosaurs.[3]

printfn "\nRemove(\"Compsognathus\")"
dinosaurs.Remove("Compsognathus") |> ignore

printDinosaurs()

dinosaurs.TrimExcess()
printfn "\nTrimExcess()"
printfn "Capacity: %i" dinosaurs.Capacity
printfn "Count: %i" dinosaurs.Count

dinosaurs.Clear()
printfn "\nClear()"
printfn "Capacity: %i" dinosaurs.Capacity
printfn "Count: %i" dinosaurs.Count

0 // return an integer exit code

(* 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
*)
``````

## Комментарии

Этот метод можно использовать для снижения нагрузки на память коллекции, если в коллекцию не добавляются новые элементы.This method can be used to minimize a collection's memory overhead if no new elements will be added to the collection. Однако стоимость повторного выделения и копирования больших List<T> может быть значительной, поэтому метод TrimExcess не выполняет никаких действий, если список имеет более 90 процентов емкости.The cost of reallocating and copying a large List<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.

Примечание

Текущее пороговое значение, равное 90%, может измениться в будущих выпусках.The current threshold of 90 percent might change in future releases.

Этот метод является операцией O (n), где nCount.This method is an O(n) operation, where n is Count.

Чтобы сбросить List<T> до начального состояния, вызовите метод Clear перед вызовом метода TrimExcess.To reset a List<T> to its initial state, call the Clear method before calling the TrimExcess method. Удаление пустой List<T> задает емкость объекта List<T> емкость по умолчанию.Trimming an empty List<T> sets the capacity of the List<T> to the default capacity.

Емкость также можно задать с помощью свойства Capacity.The capacity can also be set using the Capacity property.