Загрузка...

Справочник по коллекциям

Справочник по коллекциям в C# представляет собой основу для работы с набором данных в управляемой памяти. Коллекции позволяют хранить, организовывать и обрабатывать объекты разного типа с соблюдением принципов объектно-ориентированного программирования (ООП), обеспечивая гибкость и масштабируемость приложений. Они используются для динамического управления данными, эффективного выполнения алгоритмов поиска, сортировки и фильтрации, а также для создания модульных и поддерживаемых систем.
Использование коллекций критично при разработке сложных приложений: систем управления заказами, пользовательских интерфейсов, аналитических платформ и многопоточных сервисов. В C# коллекции охватывают структуры данных, такие как List, Dictionary\, Queue, Stack и HashSet, каждая из которых оптимизирована под конкретные задачи. Основные концепции языка, включая синтаксис, обобщения, LINQ, итераторы и интерфейсы IEnumerable/ICollection, тесно интегрированы с коллекциями.
Читатель данного справочника научится правильно выбирать тип коллекции, оптимизировать операции с данными, управлять исключениями и обеспечивать производительность приложений. Кроме того, справочник раскрывает лучшие практики использования коллекций, предотвращение утечек памяти, и разработку алгоритмов, эффективно взаимодействующих с коллекциями в реальных проектах, обеспечивая надежную архитектуру и расширяемость системы.

Базовый Пример

text
TEXT Code
using 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, одной из наиболее часто применяемых коллекций в C#. Создание List фрукты = new List { "Яблоко", "Банан", "Вишня" }; размещает коллекцию в управляемой памяти с возможностью динамического изменения размера. Метод фрукты.Add("Апельсин"); добавляет новый элемент, а фрукты[1] = "Манго"; позволяет заменить существующий элемент. Цикл foreach обеспечивает безопасную итерацию без риска выхода за пределы индекса. Проверка наличия элемента с помощью фрукты.Contains("Вишня") демонстрирует встроенные оптимизированные методы поиска.
В практических проектах List и другие коллекции, такие как Dictionary\, Queue, Stack и HashSet, используются для управления пользовательскими данными, очередями событий и каталогами продуктов. Пример соблюдает принципы ООП, включая инкапсуляцию и модульность, что обеспечивает поддержку масштабируемых и устойчивых архитектур.

Практический Пример

text
TEXT Code
using 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

text
TEXT Code
using 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\ для быстрой выборки по ключу, HashSet для исключения дубликатов и LINQ для сортировки и фильтрации. ProductComparer настраивает сравнение объектов. Best Practices включают обработку исключений, использование generic-типов и LINQ для повышения производительности. Выбор подходящей коллекции (List для упорядоченных данных, Dictionary\ для быстрых lookup, HashSet для уникальных элементов) критичен для оптимального использования памяти и производительности. Понимание коллекций обеспечивает создание масштабируемых, модульных и надежных архитектур.

C# Best Practices и pitfalls

text
TEXT Code
* Используйте 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, Dictionary\, Queue, Stack, HashSet и concurrent-коллекций позволяет разрабатывать масштабируемые и надежные приложения. Следующим шагом рекомендуется углубиться в LINQ, ObservableCollection, Sorted Collections и многопоточную обработку данных. Практические советы включают выбор структуры данных под задачу, использование generics, обработку исключений и применение шаблонов проектирования для коллекций. Для продолжения обучения полезны официальная документация Microsoft, open-source проекты и курсы по C# для продвинутого уровня.

🧠 Проверьте Свои Знания

Готов к Началу

Test Your Knowledge

Test your understanding of this topic with practical questions.

4
Вопросы
🎯
70%
Для Прохождения
♾️
Время
🔄
Попытки

📝 Инструкции

  • Внимательно прочитайте каждый вопрос
  • Выберите лучший ответ на каждый вопрос
  • Вы можете пересдавать тест столько раз, сколько захотите
  • Ваш прогресс будет показан вверху