ΠΠ±Π·ΠΎΡ Π²ΠΎΠΏΡΠΎΡΠΎΠ² ΠΏΠΎ ΡΠ·ΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΠΈΡΠΎΠ²Π°Π½ΠΈΡ 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/DictionaryImmutableList<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/DictionaryList<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β¨