Справочник по коллекциям
Справочник по коллекциям в C# представляет собой основу для работы с набором данных в управляемой памяти. Коллекции позволяют хранить, организовывать и обрабатывать объекты разного типа с соблюдением принципов объектно-ориентированного программирования (ООП), обеспечивая гибкость и масштабируемость приложений. Они используются для динамического управления данными, эффективного выполнения алгоритмов поиска, сортировки и фильтрации, а также для создания модульных и поддерживаемых систем.
Использование коллекций критично при разработке сложных приложений: систем управления заказами, пользовательских интерфейсов, аналитических платформ и многопоточных сервисов. В C# коллекции охватывают структуры данных, такие как List
Читатель данного справочника научится правильно выбирать тип коллекции, оптимизировать операции с данными, управлять исключениями и обеспечивать производительность приложений. Кроме того, справочник раскрывает лучшие практики использования коллекций, предотвращение утечек памяти, и разработку алгоритмов, эффективно взаимодействующих с коллекциями в реальных проектах, обеспечивая надежную архитектуру и расширяемость системы.
Базовый Пример
textusing System;
using System.Collections.Generic;
namespace CollectionsReferenceExample
{
class Program
{
static void Main(string\[] args)
{
// Создание списка строк
List<string> фрукты = new List<string> { "Яблоко", "Банан", "Вишня" };
// Добавление нового элемента
фрукты.Add("Апельсин");
// Изменение существующего элемента
фрукты[1] = "Манго";
// Перебор элементов коллекции
Console.WriteLine("Список фруктов:");
foreach (string item in фрукты)
{
Console.WriteLine(item);
}
// Проверка наличия элемента
if (фрукты.Contains("Вишня"))
{
Console.WriteLine("Вишня присутствует в списке.");
}
}
}
}
В этом примере показано использование List
В практических проектах List
Практический Пример
textusing System;
using System.Collections.Generic;
namespace AdvancedCollectionsExample
{
class Человек
{
public string Имя { get; set; }
public int Возраст { get; set; }
}
class Program
{
static void Main(string[] args)
{
// Создание словаря с уникальными идентификаторами
Dictionary<int, Человек> люди = new Dictionary<int, Человек>();
люди.Add(1, new Человек { Имя = "Алиса", Возраст = 30 });
люди.Add(2, new Человек { Имя = "Боб", Возраст = 25 });
люди.Add(3, new Человек { Имя = "Чарли", Возраст = 35 });
// Безопасный доступ к элементу
if (люди.TryGetValue(2, out Человек найденный))
{
Console.WriteLine($"Найден человек: {найденный.Имя}, {найденный.Возраст} лет");
}
// Перебор словаря
foreach (var entry in люди)
{
Console.WriteLine($"ID: {entry.Key}, Имя: {entry.Value.Имя}");
}
// Удаление элемента
люди.Remove(3);
}
}
}
Advanced C# Implementation
textusing System;
using System.Collections.Generic;
using System.Linq;
namespace EnterpriseCollectionsExample
{
class Продукт
{
public string Название { get; set; }
public decimal Цена { get; set; }
}
class Program
{
static void Main(string[] args)
{
try
{
// HashSet для уникальных элементов
HashSet<Продукт> продукты = new HashSet<Продукт>(new ProductComparer())
{
new Продукт { Название = "Ноутбук", Цена = 1200 },
new Продукт { Название = "Планшет", Цена = 450 },
new Продукт { Название = "Ноутбук", Цена = 1200 } // игнорируется
};
// LINQ для фильтрации и сортировки
var дорогиеПродукты = продукты
.Where(p => p.Цена > 500)
.OrderByDescending(p => p.Цена)
.ToList();
foreach (var prod in дорогиеПродукты)
{
Console.WriteLine($"Продукт: {prod.Название}, Цена: {prod.Цена}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
}
class ProductComparer : IEqualityComparer<Продукт>
{
public bool Equals(Продукт x, Продукт y)
{
return x.Название == y.Название && x.Цена == y.Цена;
}
public int GetHashCode(Продукт obj)
{
return obj.Название.GetHashCode() ^ obj.Цена.GetHashCode();
}
}
}
Примеры показывают использование Dictionary\
C# Best Practices и pitfalls
text* Используйте generic-коллекции для типобезопасности
* Выбирайте подходящую структуру данных: List<T>, Dictionary\<TKey,TValue>, Queue<T>, Stack<T>, HashSet<T>
* Обрабатывайте исключения при работе с коллекциями
* Используйте foreach для безопасной итерации
* Минимизируйте вложенные циклы для производительности
* В больших коллекциях используйте LINQ с осторожностью
* Удаляйте неиспользуемые ссылки для GC
* Тестируйте производительность больших коллекций
* Для многопоточности применяйте concurrent-коллекции
* Реализуйте кастомные Comparer для integrity данных
📊 Полная Справка
C# Element/Method | Description | Syntax | Example | Notes |
---|---|---|---|---|
List<T> | Динамический упорядоченный список | List<int> numbers = new List<int>(); | numbers.Add(10); | Индексированный доступ, авторасширение |
List<T>.Add() | Добавление элемента | numbers.Add(10); | numbers.Add(5); | O(1) среднее |
List<T>.Remove() | Удаление элемента | numbers.Remove(10); | numbers.Remove(5); | Возвращает true если успешно |
List<T>.Contains() | Проверка наличия | numbers.Contains(10); | bool exists = numbers.Contains(5); | Линейный поиск |
List<T>.Count | Количество элементов | numbers.Count | int total = numbers.Count; | Динамически |
Dictionary\<TKey,TValue> | Коллекция ключ-значение | Dictionary\<int,string> dict = new Dictionary\<int,string>(); | dict.Add(1,"Alice"); | Быстрый lookup |
Dictionary\<TKey,TValue>.Add() | Добавление пары | dict.Add(1,"Alice"); | dict.Add(2,"Bob"); | Ошибка при дублировании ключа |
Dictionary\<TKey,TValue>.TryGetValue() | Безопасный доступ | dict.TryGetValue(2,out string val); | bool found = dict.TryGetValue(1,out string name); | Избегает исключений |
Dictionary\<TKey,TValue>.Remove() | Удаление пары | dict.Remove(1); | dict.Remove(2); | True если удалено |
Dictionary\<TKey,TValue>.Keys | Получение ключей | var keys = dict.Keys; | foreach(var key in dict.Keys) | Только чтение |
Dictionary\<TKey,TValue>.Values | Получение значений | var values = dict.Values; | foreach(var val in dict.Values) | Только чтение |
Queue<T> | Очередь FIFO | Queue<int> q = new Queue<int>(); | q.Enqueue(10); | First-In-First-Out |
Queue<T>.Enqueue() | Добавление | q.Enqueue(10); | q.Enqueue(20) | O(1) |
Queue<T>.Dequeue() | Удаление первого | q.Dequeue(); | int first = q.Dequeue(); | Ошибка если пусто |
Queue<T>.Peek() | Просмотр первого | q.Peek(); | int peek = q.Peek(); | Ошибка если пусто |
Stack<T> | Стек LIFO | Stack<int> s = new Stack<int>(); | s.Push(10); | Last-In-First-Out |
Stack<T>.Push() | Добавление элемента | s.Push(10); | s.Push(20) | O(1) |
Stack<T>.Pop() | Удаление верхнего | s.Pop(); | int top = s.Pop(); | O(1), ошибка если пусто |
Stack<T>.Peek() | Просмотр верхнего | s.Peek(); | int top = s.Peek(); | Ошибка если пусто |
HashSet<T> | Уникальные элементы | HashSet<int> hs = new HashSet<int>(); | hs.Add(10); | Предотвращает дубликаты |
HashSet<T>.Add() | Добавление | hs.Add(10); | hs.Add(5); | False если уже есть |
HashSet<T>.Remove() | Удаление | hs.Remove(10); | hs.Remove(5); | True если удалено |
HashSet<T>.Contains() | Проверка наличия | hs.Contains(10); | bool exists = hs.Contains(5); | O(1) среднее |
IEnumerable<T> | Интерфейс итерации | IEnumerable<int> numbers | foreach(var n in numbers) | Базовый для foreach и LINQ |
ICollection<T> | Интерфейс коллекции | ICollection<int> coll | coll.Count | Поддерживает Count, Add, Remove |
IList<T> | Интерфейс списка | IList<int> list | list\[0] = 10 | Индексированный доступ |
IReadOnlyCollection<T> | Только для чтения | IReadOnlyCollection<int> readOnly | int total = readOnly.Count | Без модификации |
IReadOnlyList<T> | Только для чтения с индексами | IReadOnlyList<int> readOnlyList | int first = readOnlyList\[0] | Read-only |
ObservableCollection<T> | Коллекция с уведомлениями | ObservableCollection<int> oc = new ObservableCollection<int>(); | oc.CollectionChanged += Handler | Для MVVM |
словарь | ConcurrentDictionary\<int,string> cd = new ConcurrentDictionary\<int,string>(); | cd.TryAdd(1,"Alice"); | Многопоточность | |
ConcurrentQueue<T> | Потокобезопасная очередь | ConcurrentQueue<int> cq = new ConcurrentQueue<int>(); | cq.TryDequeue(out int val); | Многопоточность |
ConcurrentStack<T> | Потокобезопасный стек | ConcurrentStack<int> cs = new ConcurrentStack<int>(); | cs.TryPop(out int val); | Многопоточность |
📊 Complete C# Properties Reference
Property | Values | Default | Description | C# Support |
---|---|---|---|---|
Count | int | 0 | Количество элементов в коллекции | Все коллекции |
Capacity | int | динамически | Емкость перед расширением | List<T>, ArrayList |
IsReadOnly | bool | false | Только для чтения | ICollection<T>, IList<T> |
Keys | TKey Collection | N/A | Все ключи словаря | Dictionary\<TKey,TValue> |
Values | TValue Collection | N/A | Все значения словаря | Dictionary\<TKey,TValue> |
Comparer | IEqualityComparer | Default | Сравнитель для HashSet/Dictionary | HashSet<T>, Dictionary\<TKey,TValue> |
SyncRoot | object | null | Объект синхронизации | ICollection |
IsSynchronized | bool | false | Потокобезопасность | ICollection |
CollectionChanged | Event | N/A | Событие изменения коллекции | ObservableCollection<T> |
CapacityChanged | Event | N/A | Событие изменения емкости | List<T> |
Comparer | IComparer | Default | Для сортированных коллекций | SortedList\<TKey,TValue>, SortedDictionary\<TKey,TValue> |
Изучение Справочника по коллекциям позволяет эффективно управлять данными в C#, выбирать подходящие структуры, избегать утечек памяти и обеспечивать высокую производительность. Применение List
🧠 Проверьте Свои Знания
Test Your Knowledge
Test your understanding of this topic with practical questions.
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху