ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ вопросов ❓ Π½Π° собСсСдовании Π² C# 🍧

ΠžΠ±Π·ΠΎΡ€ вопросов ΠΏΠΎ языка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ C# ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ NET


Project maintained by Dvurechensky-Docs Hosted on GitHub Pages — Theme by mattgraham

πŸ“‹ Π§Π΅ΠΌ `List'T'` отличаСтся ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ?

Typing SVG

Static Badge

✨ ОглавлСниС

⬆ Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ


πŸ”‘ ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΎ β€” Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ List<T>

List<T> β€” это динамичСский массив: ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΠ½ Ρ…Ρ€Π°Π½ΠΈΡ‚ элСмСнты Π² ΠΎΠ΄Π½ΠΎΠΌ T[] _items. ПовСдСниС ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ массив, Π½ΠΎ:


🧩 ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ характСристики 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)


βš™οΈ Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ)

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€Π° (growth)

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹

TrimExcess()

AsReadOnly() ΠΈ ToArray()

ВСрсионированиС ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ

БтатичСскиС поля per-closed-type

Boxing ΠΈ value-types

Enumerator ΠΊΠ°ΠΊ struct (ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ)


πŸ“ˆ БлоТности (Big-O) β€” быстро

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ БрСдняя/Π°ΠΌΠΎΡ€Ρ‚. Π₯ΡƒΠ΄ΡˆΠ°Ρ
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) (пСрСралокация)

🧨 ЧастыС ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ / собСс-Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ (ΠΈ ΠΊΠ°ΠΊ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ)

1) Β«Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Capacity?Β»

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΎ: это Π΄Π»ΠΈΠ½Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ массива; Count β€” Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ число элСмСнтов. Capacity >= Count. Установка Capacity < Count β€” ошибка.

2) Β«ΠŸΠΎΡ‡Π΅ΠΌΡƒ Add Π½Π΅ всСгда O(1)?Β»

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π±ΡƒΡ„Π΅Ρ€Π° трСбуСтся пСрСраспрСдСлСниС ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β†’ ΠΎΠ΄Π½Π° опСрация ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ O(n), Π½ΠΎ сСрия Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΉ Π°ΠΌΠΎΡ€Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ O(1).

3) «МоТно Π»ΠΈ бСзопасно ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ элСмСнты Π² foreach?Β»

НСт β€” ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ вСрсии ΠΈ бросит InvalidOperationException. РСшСниС: ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ индСксу (Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ) ΠΈΠ»ΠΈ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ список удаляСмых элСмСнтов ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΡ… послС.

4) Β«List.Sort β€” ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ?Β»

Sort Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Если Π½ΡƒΠΆΠ½Π° ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°Ρ сортировка β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ OrderBy/ThenBy (LINQ) ΠΈΠ»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ.

5) Β«ΠŸΠΎΡ‡Π΅ΠΌΡƒ List<T> быстрСС LinkedList<T> для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π°?Β»

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ элСмСнты Π² List<T> хранятся подряд β†’ Π»ΡƒΡ‡ΡˆΠ°Ρ кэш-Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ β†’ мСньшС ΠΏΡ€ΠΎΠΌΠ°Ρ…ΠΎΠ² кэша β†’ быстрСС Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

6) Β«Π§Π΅ΠΌ List<T> отличаСтся ΠΎΡ‚ IList<T>?Β»

IList<T> β€” интСрфСйс (ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚), List<T> β€” рСализация этого ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

7) «Как ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π±ΠΎΠΊcΠΈΠ½Π³Π° ΠΏΡ€ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠΈ value-type?Β»

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ List<T> с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ value type (List<int>), Π½Π΅ List<object>. Но ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΊ non-generic интСрфСйсу Π±ΠΎΠΊcΠΈΠ½Π³ всё Ρ€Π°Π²Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½.

8) «Если Π½ΡƒΠΆΠ½ΠΎ быстрый поиск ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ List<T>?Β»

НСт. Для быстрых поисков β€” Dictionary/HashSet (Ρ…Π΅Ρˆ) ΠΈΠ»ΠΈ SortedDictionary (Π»ΠΎΠ³Π°Ρ€ΠΈΡ„ΠΌ) β€” Π³ΠΎΡ€Π°Π·Π΄ΠΎ эффСктивнСС.

9) «Как ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π°Π»Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ массовом Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ?Β»

ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Add Π² Ρ†ΠΈΠΊΠ»Π΅ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ list.Capacity = expectedCount ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ new List<T>(expectedCount) ΠΈΠ»ΠΈ AddRange с ICollection<T>.

10) Β«Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ToArray() vs AsReadOnly()?Β»


πŸ”§ ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ практичСскиС ΠΏΡ€ΠΈΡ‘ΠΌΡ‹ ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ


βœ… Вопросы Π½Π° собСсС (Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Π΅) + ΠΊΡ€Π°Ρ‚ΠΊΠΈΠ΅ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹

  1. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Capacity ΠΈ Ρ‡Π΅ΠΌ отличаСтся ΠΎΡ‚ Count? Count β€” Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ число элСмСнтов; Capacity β€” Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ массива. Capacity β‰₯ Count.

  2. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Add Π°ΠΌΠΎΡ€Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ O(1)? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ рост Π±ΡƒΡ„Π΅Ρ€Π° выполняСтся Ρ€Π΅Π΄ΠΊΠΎ (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΠ΄Π²Π°ΠΈΠ²Π°Π½ΠΈΠ΅), ΠΈ суммарная ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ n Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΉ = O(n).

  3. МоТно Π»ΠΈ бСзопасно ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ List Π² foreach? НСт β€” Π±ΡƒΠ΄Π΅Ρ‚ InvalidOperationException. Π˜Ρ‚Π΅Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ΡΡŒ индСксно ΠΈΠ»ΠΈ Π΄Π΅Π»Π°ΠΉΡ‚Π΅ копию.

  4. List<T> ΠΈΠ»ΠΈ LinkedList<T> β€” Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ? Если Π½ΡƒΠΆΠ΅Π½ быстрый доступ ΠΏΠΎ индСксу ΠΈ Π»ΡƒΡ‡ΡˆΠΈΠ΅ характСристики ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΎΠ±Ρ…ΠΎΠ΄Π΅ β€” List<T>. Если часто вставляСтС/удаляСтС элСмСнты, имСя ссылку Π½Π° ΡƒΠ·Π΅Π» β€” LinkedList<T>.

  5. Как ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ количСство Π°Π»Π»ΠΎΠΊΠ°Ρ†ΠΈΠΉ ΠΏΡ€ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ? Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ конструктор с capacity, AddRange, ΠΈΠ»ΠΈ установитС Capacity.

  6. **List.Sort β€” ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°Ρ сортировка?** НСт, ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ гарантируСтся. Для ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `OrderBy`.

  7. Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ TrimExcess()? Π‘Ρ‚Π°Π²ΠΈΡ‚ Capacity Π±Π»ΠΈΠΆΠ΅ ΠΊ Count (освобоТдаСт Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ), ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

  8. ΠžΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ToArray() ΠΈ AsReadOnly()? ToArray() β€” копия; AsReadOnly() β€” read-only view ΠΏΠΎΠ²Π΅Ρ€Ρ… Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ….

  9. Как List<T> Ρ…Ρ€Π°Π½ΠΈΡ‚ struct? ЗначСния хранятся inline Π² массивС T[] β€” Π±Π΅Π· Π±ΠΎΠΊcΠΈΠ½Π³Π°. Но ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π² IList ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠΊcΠΈΠ½Π³.

  10. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ 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);
}

✨ РСзюмС β€” Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ (ΡˆΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ° для собСса)


⬆ Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ

✨Dvurechensky✨