ΠΠ±Π·ΠΎΡ Π²ΠΎΠΏΡΠΎΡΠΎΠ² ΠΏΠΎ ΡΠ·ΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΠΈΡΠΎΠ²Π°Π½ΠΈΡ C# ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ NET
List<T>
List<T>
List<T>
ΠΏΠ΅ΡΠ΅Π΄ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡΠΌΠΈ
T[]
(ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ°ΡΡΠΈΠ²)LinkedList<T>
Queue<T>
/ Stack<T>
HashSet<T>
/ Dictionary<TKey,TValue>
SortedSet<T>
/ SortedDictionary<TKey,TValue>
ObservableCollection<T>
/ ReadOnlyCollection<T>
ConcurrentBag/Queue/Dictionary
ImmutableList<T>
(immutable collections)Capacity
?Β»Add
Π½Π΅ Π²ΡΠ΅Π³Π΄Π° O(1)?Β»foreach
?Β»List<T>
Π±ΡΡΡΡΠ΅Π΅ LinkedList<T>
Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ°?Β»List<T>
ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ IList<T>
?Β»List<T>
?Β»ToArray()
vs AsReadOnly()
?Β»β¬ ΠΠ΅ΡΠ½ΡΡΡΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ
List<T>
List<T>
β ΡΡΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ°ΡΡΠΈΠ²: ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ ΠΎΠ½ Ρ
ΡΠ°Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ T[] _items
. ΠΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ
ΠΎΠΆΠ΅ Π½Π° ΠΎΠ±ΡΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ², Π½ΠΎ:
O(1)
);O(n)
).List<T>
T[] _items
β ΠΎΠ΄ΠΈΠ½ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΡΠΉ Π±ΡΡΠ΅Ρ ΠΏΠ°ΠΌΡΡΠΈ.Count vs Capacity:
Count
β ΡΠ΅ΠΊΡΡΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ;Capacity
β Π΄Π»ΠΈΠ½Π° Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°.
Capacity >= Count
. ΠΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ, Π΅ΡΠ»ΠΈ Count == Capacity
, ΡΠΏΠΈΡΠΎΠΊ ΡΠ°ΡΡΠΈΡΡΠ΅ΡΡΡ (ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π½ΠΎΠ²ΡΠΉ ΠΌΠ°ΡΡΠΈΠ²).Add
β Π°ΠΌΠΎΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ O(1)
(ΠΈΠ½ΠΎΠ³Π΄Π° O(n)
ΠΏΡΠΈ ΡΠΎΡΡΠ΅).list[i]
β O(1)
.O(n)
(ΡΠ΄Π²ΠΈΠ³ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²).O(n)
.O(log n)
β ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ.O(n log n)
; ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΡΡΠ°Π±ΠΈΠ»ΡΠ½Π° (Π΅ΡΠ»ΠΈ Π²Π°ΠΆΠ½Π° ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡ β ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ OrderBy
).List<T>.Enumerator
β struct
(ΠΈΠ·Π±Π΅Π³Π°Π΅Ρ Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΈ ΠΏΡΠΈ foreach
Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π²). ΠΡΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΊ IEnumerable
/IEnumerator
β Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π±ΠΎΠΊΡΠΈΠ½Π³.EqualityComparer<T>.Default
.List<T>
ΠΏΠ΅ΡΠ΅Π΄ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡΠΌΠΈT[]
(ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ°ΡΡΠΈΠ²)T[]
β ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°. List<T>
β Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌΡΠΉ.O(1)
.T[]
ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΡ Π±ΡΡΡΡΠ΅Π΅ (ΠΌΠ΅Π½ΡΡΠ΅ ΠΎΠ±ΡΡΡΠΎΠΊ) ΠΈ ΠΌΠ΅Π½Π΅Π΅ Π·Π°ΡΡΠ°ΡΠ΅Π½ Π² Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΡΡ
, Π΅ΡΠ»ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ Π·Π°ΡΠ°Π½Π΅Π΅.LinkedList<T>
List<T>
β Π»ΡΡΡΠ΅Π΅ ΠΊΡΡ-ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ), Π±ΡΡΡΡΠ΅Π΅ ΠΏΠ΅ΡΠ΅Π±ΠΎΡ ΠΈ Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ.LinkedList<T>
Π΄Π°ΡΡ O(1)
Π²ΡΡΠ°Π²ΠΊΡ/ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅, Π΅ΡΠ»ΠΈ Π΅ΡΡΡ LinkedListNode<T>
; Π½ΠΎ Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ β O(n)
.LinkedList<T>
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² (nodes), ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠ°ΠΌΡΡΡ ΠΈ GC-Π½Π°Π³ΡΡΠ·ΠΊΠ° Π²ΡΡΠ΅.Queue<T>
/ Stack<T>
Queue<T>
/Stack<T>
ΡΠΎΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΌΠ°ΡΡΠΈΠ²Ρ/ΠΊΠΎΠ»ΡΡΠ° ΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡ Π±ΡΡΡΡΡΠ΅ push/pop/peek, Π½ΠΎ List<T>
β ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½Π΅Π΅ (ΠΈΠ½Π΄Π΅ΠΊΡ, range, ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ°).HashSet<T>
/ Dictionary<TKey,TValue>
O(1)
ΠΏΠΎΠΈΡΠΊ/Π²ΡΡΠ°Π²ΠΊΡ ΠΏΠΎ ΠΊΠ»ΡΡΡ (Π°ΠΌΠΎΡΡΠΈΠ·.), List<T>
β O(n)
Π² ΠΏΠΎΠΈΡΠΊΠ΅.HashSet
/Dictionary
. List<T>
β Π΄Π»Ρ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΠΈ Π΄ΠΎΡΡΡΠΏΠ° ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ.SortedSet<T>
/ SortedDictionary<TKey,TValue>
List<T>
ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ, Π½ΠΎ Π²ΡΡΠ°Π²ΠΊΠ° Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ° β O(n)
.ObservableCollection<T>
/ ReadOnlyCollection<T>
ObservableCollection<T>
β List<T>
+ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ (INotifyCollectionChanged
) β Π΄Π»Ρ Π±ΠΈΠ½Π΄ΠΈΠ½Π³Π° UI.ReadOnlyCollection<T>
β ΠΏΡΠΎΡΡΠΎ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ° Π½Π°Π΄ IList<T>
β ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ List<T>
Π²Π½ΡΡΡΠΈ.ConcurrentBag/Queue/Dictionary
List<T>
Π½Π΅ ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ΅Π½; ΠΊΠΎΠ½ΠΊΠ°ΡΡΠ΅Π½ΡΠ½ΡΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ Π΄Π»Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ°.ImmutableList<T>
(immutable collections)List<T>
β ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ; immutable ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ Π΄Π°ΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠ΅ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ, Π½ΠΎ Π΄ΠΎΡΠΎΠΆΠ΅ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΡ
(ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ).List<T>
Π²ΡΠ΄Π΅Π»ΡΠ΅Ρ Π½ΠΎΠ²ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΈ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ. ΠΠ±ΡΡΠ½ΠΎ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π²Π΄Π²ΠΎΠ΅ (Π°ΠΌΠΎΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ ΡΠΎΡΡΠ°).new List<T>()
β ΡΠ°ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΡΡΠΎΠΉ ΠΌΠ°ΡΡΠΈΠ²; ΡΠ΅Π°Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ Add
.new List<T>(int capacity)
β Π·Π°ΡΠ°Π½Π΅Π΅ Π²ΡΠ΄Π΅Π»ΡΠ΅Ρ Π½ΡΠΆΠ½ΡΠΉ Π±ΡΡΠ΅Ρ.new List<T>(IEnumerable<T>)
β Π΅ΡΠ»ΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ICollection<T>
, ΡΠΎ ΠΏΡΠ΅Π΄-Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ Π½ΡΠΆΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π΅Π· Π»ΠΈΡΠ½ΠΈΡ
ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ.TrimExcess()
Capacity
ΠΊ Count
, ΡΡΠΎΠ±Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΏΠ°ΠΌΡΡΡ; ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΠΌΠ΅Π½ΡΡΡ capacity, Π΅ΡΠ»ΠΈ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ ΠΌΠ°Π»Π° (ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΏΠΎΡΠΎΠ³). ΠΡΠ·ΠΎΠ² ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ.AsReadOnly()
ΠΈ ToArray()
AsReadOnly()
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΡ ReadOnlyCollection<T>
β Π½Π΅ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅; ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ Π²ΠΈΠ΄Π½Ρ Π² read-only view.ToArray()
ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΈ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ β Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ Π΄Π»Ρ snapshot.List<T>
ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ _version
. ΠΡΠ»ΠΈ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½ Π²ΠΎ Π²ΡΠ΅ΠΌΡ foreach
, Enumerator
Π±ΡΠΎΡΠΈΡ InvalidOperationException
(fail-fast).
β ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ°: ΡΠΎΠ±ΠΈΡΠ°ΡΡ Π΄Π»Ρ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ»ΠΈ ΠΈΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎ ΠΊΠΎΠΏΠΈΠΈ, ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠΊΠ» for
(ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌ) ΠΈ ΠΈΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π°Π·Π°Π΄ ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ.T
(Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, List<int>
ΠΈ List<string>
β ΡΠ²ΠΎΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΠΎΠ»Ρ).List<T>
ΠΏΡΠΈ T
= value type (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, int
) Ρ
ΡΠ°Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π±Π΅Π· Π±ΠΎΠΊcΠΈΠ½Π³Π° β Π²ΡΠ³ΠΎΠ΄Π½ΠΎ ΠΏΠΎ ΠΏΡΠΎΠΈΠ²Π·ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ArrayList
/List<object>
.IList
) ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ Π±ΠΎΠΊcΠΈΠ½Π³ΠΈ.List<T>.Enumerator
β struct
, ΠΏΠΎΡΡΠΎΠΌΡ foreach
ΠΏΠΎ List<T>
ΠΎΠ±ΡΡΠ½ΠΎ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΉ. ΠΠΎ:
IEnumerable<T>
/IEnumerable
, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π²ΡΠ·ΡΠ²Π°Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΡΡ GetEnumerator
ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π±ΠΎΠΊcΠΈΠ½Π³Ρ enumeratorβΠ° (ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ), ΡΡΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΡ.ΠΠΏΠ΅ΡΠ°ΡΠΈΡ | Π‘ΡΠ΅Π΄Π½ΡΡ/Π°ΠΌΠΎΡΡ. | Π₯ΡΠ΄ΡΠ°Ρ |
---|---|---|
Add |
O(1) Π°ΠΌΠΎΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ΠΎ | O(n) (ΠΏΡΠΈ ΡΠ΅ΡΠ°ΠΉΠ·Π΅) |
Insert (Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ) |
O(n) | O(n) |
Remove (ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ) |
O(n) | O(n) |
RemoveAt |
O(n) (ΡΠ΄Π²ΠΈΠ³) | O(n) |
IndexOf / Contains |
O(n) | O(n) |
this[i] (get/set) |
O(1) | O(1) |
BinarySearch |
O(log n) | O(log n) |
Sort |
O(n log n) | O(n log n) |
ToArray |
O(n) | O(n) |
AddRange (ΠΈΠ· ICollection) |
O(k) (ΠΊΡΠ°ΡΠ½ΠΎΠ΅) | O(n) (ΠΏΠ΅ΡΠ΅ΡΠ°Π»ΠΎΠΊΠ°ΡΠΈΡ) |
Capacity
?Β»ΠΠΎΡΠΎΡΠΊΠΎ: ΡΡΠΎ Π΄Π»ΠΈΠ½Π° Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°; Count
β ΡΠ΅Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ². Capacity
>= Count
. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Capacity < Count
β ΠΎΡΠΈΠ±ΠΊΠ°.
Add
Π½Π΅ Π²ΡΠ΅Π³Π΄Π° O(1)?Β»ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΡΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π±ΡΡΠ΅ΡΠ° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ β ΠΎΠ΄Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ O(n), Π½ΠΎ ΡΠ΅ΡΠΈΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΉ Π°ΠΌΠΎΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎ O(1).
foreach
?Β»ΠΠ΅Ρ β ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΠΈΡΠ΅Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²Π΅ΡΡΠΈΠΈ ΠΈ Π±ΡΠΎΡΠΈΡ InvalidOperationException
. Π Π΅ΡΠ΅Π½ΠΈΠ΅: ΠΈΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ (Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ) ΠΈΠ»ΠΈ ΡΠΎΠ±ΠΈΡΠ°ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠ΄Π°Π»ΡΠ΅ΠΌΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈ ΡΠ΄Π°Π»ΠΈΡΡ ΠΈΡ
ΠΏΠΎΡΠ»Π΅.
Sort Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡ. ΠΡΠ»ΠΈ Π½ΡΠΆΠ½Π° ΡΡΠ°Π±ΠΈΠ»ΡΠ½Π°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° β ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ OrderBy
/ThenBy
(LINQ) ΠΈΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ.
List<T>
Π±ΡΡΡΡΠ΅Π΅ LinkedList<T>
Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ°?Β»ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² List<T>
Ρ
ΡΠ°Π½ΡΡΡΡ ΠΏΠΎΠ΄ΡΡΠ΄ β Π»ΡΡΡΠ°Ρ ΠΊΡΡ-Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΡΡΡ β ΠΌΠ΅Π½ΡΡΠ΅ ΠΏΡΠΎΠΌΠ°Ρ
ΠΎΠ² ΠΊΡΡΠ° β Π±ΡΡΡΡΠ΅Π΅ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΡΡΠΈ.
List<T>
ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ IList<T>
?Β»IList<T>
β ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ (ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ), List<T>
β ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°. ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ List<T>
Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ value type (List<int>
), Π½Π΅ List<object>
. ΠΠΎ ΠΏΡΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΊ non-generic ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π±ΠΎΠΊcΠΈΠ½Π³ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½.
List<T>
?Β»ΠΠ΅Ρ. ΠΠ»Ρ Π±ΡΡΡΡΡΡ
ΠΏΠΎΠΈΡΠΊΠΎΠ² β Dictionary
/HashSet
(Ρ
Π΅Ρ) ΠΈΠ»ΠΈ SortedDictionary
(Π»ΠΎΠ³Π°ΡΠΈΡΠΌ) β Π³ΠΎΡΠ°Π·Π΄ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π΅Π΅.
ΠΠ΅ΡΠ΅Π΄ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ Add
Π² ΡΠΈΠΊΠ»Π΅ Π²ΡΠ·ΠΎΠ²ΠΈΡΠ΅ list.Capacity = expectedCount
ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ new List<T>(expectedCount)
ΠΈΠ»ΠΈ AddRange
Ρ ICollection<T>
.
ToArray()
vs AsReadOnly()
?Β»ToArray()
β ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² Π½ΠΎΠ²ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² (snapshot).AsReadOnly()
β Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΡ; ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ ΠΎΡΡΠ°ΠΆΠ°ΡΡΡΡ Π² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ.new List<T>(capacity)
(ΠΈΠ·Π±Π΅ΠΆΠΈΡΡ ΡΠ΅ΡΠ°ΠΉΠ·ΠΎΠ²).StringBuilder
(Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π°Ρ ΠΈΠ΄Π΅Ρ: Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²).AddRange
Π±ΡΡΡΡΠ΅Π΅, ΡΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ Add
.RemoveAll(predicate)
(ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π°).lock(list)
ΠΈΠ»ΠΈ ConcurrentCollection
.ref struct
/Span<T>
ΠΈΠ»ΠΈ Ρ
ΡΠ°Π½Π΅Π½ΠΈΠΈ ΡΡΡΠ»ΠΎΠΊ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Β«Π΄ΠΎΡΠΎΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡΒ».Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Capacity
ΠΈ ΡΠ΅ΠΌ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ Count
?
Count
β ΡΠ΅ΠΊΡΡΠ΅Π΅ ΡΠΈΡΠ»ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²; Capacity
β ΡΠ°Π·ΠΌΠ΅Ρ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°. Capacity
β₯ Count
.
ΠΠΎΡΠ΅ΠΌΡ Add
Π°ΠΌΠΎΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ O(1)?
ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠΎΡΡ Π±ΡΡΠ΅ΡΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ΅Π΄ΠΊΠΎ (ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ΄Π²Π°ΠΈΠ²Π°Π½ΠΈΠ΅), ΠΈ ΡΡΠΌΠΌΠ°ΡΠ½Π°Ρ ΡΡΠΎΠΈΠΌΠΎΡΡΡ n Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΉ = O(n).
ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ List Π² foreach
?
ΠΠ΅Ρ β Π±ΡΠ΄Π΅Ρ InvalidOperationException
. ΠΡΠ΅ΡΠΈΡΡΠΉΡΠ΅ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΠΎ ΠΈΠ»ΠΈ Π΄Π΅Π»Π°ΠΉΡΠ΅ ΠΊΠΎΠΏΠΈΡ.
List<T>
ΠΈΠ»ΠΈ LinkedList<T>
β ΡΡΠΎ Π²ΡΠ±ΡΠ°ΡΡ?
ΠΡΠ»ΠΈ Π½ΡΠΆΠ΅Π½ Π±ΡΡΡΡΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ ΠΈ Π»ΡΡΡΠΈΠ΅ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΌ ΠΎΠ±Ρ
ΠΎΠ΄Π΅ β List<T>
. ΠΡΠ»ΠΈ ΡΠ°ΡΡΠΎ Π²ΡΡΠ°Π²Π»ΡΠ΅ΡΠ΅/ΡΠ΄Π°Π»ΡΠ΅ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, ΠΈΠΌΠ΅Ρ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΠ·Π΅Π» β LinkedList<T>
.
ΠΠ°ΠΊ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΉ ΠΏΡΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ?
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Ρ capacity
, AddRange
, ΠΈΠ»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Capacity
.
**List
Π§ΡΠΎ Π΄Π΅Π»Π°Π΅Ρ TrimExcess()
?
Π‘ΡΠ°Π²ΠΈΡ Capacity
Π±Π»ΠΈΠΆΠ΅ ΠΊ Count
(ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΏΠ°ΠΌΡΡΡ), ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅.
ΠΡΠ»ΠΈΡΠΈΠ΅ ToArray()
ΠΈ AsReadOnly()
?
ToArray()
β ΠΊΠΎΠΏΠΈΡ; AsReadOnly()
β read-only view ΠΏΠΎΠ²Π΅ΡΡ
ΡΠ΅ΠΊΡΡΠΈΡ
Π΄Π°Π½Π½ΡΡ
.
ΠΠ°ΠΊ List<T>
Ρ
ΡΠ°Π½ΠΈΡ struct
?
ΠΠ½Π°ΡΠ΅Π½ΠΈΡ Ρ
ΡΠ°Π½ΡΡΡΡ inline Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ T[]
β Π±Π΅Π· Π±ΠΎΠΊcΠΈΠ½Π³Π°. ΠΠΎ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ Π² IList
ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±ΠΎΠΊcΠΈΠ½Π³.
ΠΠ΅ΡΠ΅ΡΠΈΡΠ»ΠΈΡΠ΅Π»Ρ List<T>
β ΡΡΠΎ ΠΊΠ»Π°ΡΡ ΠΈΠ»ΠΈ ΡΡΡΡΠΊΡΡΡΠ°?
ΠΡΠΎ struct
β ΠΎΠ±ΡΡΠ½ΠΎ Π±Π΅Π· Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΉ ΠΏΡΠΈ foreach
, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΠΎΠΊΡΠΈΡΡΡΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°.
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° β Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ:
foreach (var item in list) // InvalidOperationException Π΅ΡΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ list
{
if (ShouldRemove(item)) list.Remove(item);
}
ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ β ΠΈΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π°Π·Π°Π΄ ΠΏΠΎ index:
for (int i = list.Count - 1; i >= 0; i--)
{
if (ShouldRemove(list[i])) list.RemoveAt(i);
}
ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ ΠΊ capacity Π·Π°ΡΠ°Π½Π΅Π΅:
var list = new List<int>(expectedCount);
for (...) list.Add(x);
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ:
if (source is ICollection<T> coll)
{
list.Capacity = list.Count + coll.Count;
// ΠΏΠΎΡΠΎΠΌ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ
ΡΠ΅ΡΠ°ΠΉΠ·ΠΎΠ²
}
else
{
list.AddRange(source);
}
List<T>
= Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ°ΡΡΠΈΠ² (T[]
) + Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅.Count
vs Capacity
. Add
Π°ΠΌΠΎΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ O(1)
, Π²ΡΡΠ°Π²ΠΊΠΈ Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ β O(n)
.struct
(ΠΎΠ±ΡΡΠ½ΠΎ Π±Π΅Π· allocations), Π½ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΡ β ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅.List<T>
, Π° Dictionary/HashSet
.LinkedList<T>
ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΡΡΡΠ΅ ΠΏΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ, Π½ΠΎ Ρ List<T>
Π»ΡΡΡΠ΅ ΠΊΡΡ-Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΡΡΡ.new List<T>(capacity)
/AddRange
/ToArray
/TrimExcess
ΡΠ°Π·ΡΠΌΠ½ΠΎ.β¬ ΠΠ΅ΡΠ½ΡΡΡΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ
β¨Dvurechenskyβ¨