LastName = "Simpson", Age = 47 } },
{ "Marge", new Person { FirstName = "Marge",
LastName = "Simpson", Age = 45 } },
{ "Lisa", new Person { FirstName = "Lisa",
LastName = "Simpson", Age = 9 } }
};
// Получить элемент с ключом Lisa.
Person lisa = peopleB["Lisa"];
Console.WriteLine(lisa);
}
Наполнять Dictionary также возможно с применением связанного синтаксиса инициализации, который является специфичным для контейнера данного типа (вполне ожидаемо называемый personB в предыдущем примере, для объекта коллекции определяется область инициализации; однако можно также применять индексатор, чтобы указать ключ, и присвоить ему новый объект:
// Наполнить с помощью синтаксиса инициализации словарей.
Dictionary
{
["Homer"] = new Person { FirstName = "Homer",
LastName = "Simpson", Age = 47 },
["Marge"] = new Person { FirstName = "Marge",
LastName = "Simpson", Age = 45 },
["Lisa"] = new Person { FirstName = "Lisa",
LastName = "Simpson", Age = 9 }
};
Пространство имен System.Collections.ObjectModel
Теперь, когда вы понимаете, как работать с основными обобщенными классами, можно кратко рассмотреть дополнительное пространство имен, связанное с коллекциями — System.Collections.ObjectModel. Это относительно небольшое пространство имен, содержащее совсем мало классов. В табл. 10.7 документированы два класса, о которых вы обязательно должны быть осведомлены.
Класс ObservableCollection удобен своей возможностью информировать внешние объекты, когда его содержимое каким-то образом изменяется (как и можно было догадаться, работа с ReadOnlyObservableCollection похожа, но по своей природе допускает только чтение).
Работа с классом ObservableCollection
Создайте новый проект консольного приложения по имени FunWithObservableCollections и импортируйте в первоначальный файл кода C# пространство имен System.Collections.ObjectModel. Во многих отношениях работа с ObservableCollection идентична работе с List, учитывая, что оба класса реализуют те же самые основные интерфейсы. Уникальным класс ObservableCollectionCollectionChanged. Указанное событие будет инициироваться каждый раз, когда вставляется новый элемент, удаляется (или перемещается) существующий элемент либо модифицируется вся коллекция целиком.
Подобно любому другому событию событие CollectionChanged определено в терминах делегата, которым в данном случае является NotifyCollectionChangedEventHandler. Этот делегат может вызывать любой метод, который принимает object в первом параметре и NotifyCollectionChangedEventArgs — во втором. Рассмотрим следующий код, в котором наполняется наблюдаемая коллекция, содержащая объекты Person, и осуществляется привязка к событию CollectionChanged:
using System;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using FunWithObservableCollections;
// Сделать коллекцию наблюдаемой
// и добавить в нее несколько объектов Person.
ObservableCollection
{
new Person{ FirstName = "Peter", LastName = "Murphy", Age = 52 },
new Person{ FirstName = "Kevin", LastName = "Key", Age = 48 },
};
// Привязаться к событию CollectionChanged.