Шрифт:
Интервал:
Закладка:
}
Запустив приложение, легко заметить, что список объектов будет всегда упорядочен на основе значения свойства Age независимо от порядка вставки и удаления объектов:
***** Fun with Generic Collections *****
Name: Bart Simpson, Age: 8
Name: Lisa Simpson, Age: 9
Name: Marge Simpson, Age: 45
Name: Homer Simpson, Age: 47
Name: Saku Jones, Age: 1
Name: Bart Simpson, Age: 8
Name: Lisa Simpson, Age: 9
Name: Mikko Jones, Age: 32
Name: Marge Simpson, Age: 45
Name: Homer Simpson, Age: 47
Работа с классом Dictionary<TKey,TValue>
Еще одной удобной обобщенной коллекцией является класс Dictionary<TKey,TValue>, позволяющий хранить любое количество объектов, на которые можно ссылаться через уникальный ключ. Таким образом, вместо получения элемента из List<T> с использованием числового идентификатора (например, "извлечь второй объект") можно применять уникальный строковый ключ (скажем, "предоставить объект с ключом Homer").
Как и другие классы коллекций, наполнять Dictionary<TKey,TValue> можно путем вызова обобщенного метода Add() вручную. Тем не менее, заполнять Dictionary<TKey,TValue> допускается также с использованием синтаксиса инициализации коллекций. Имейте в виду, что при наполнении данного объекта коллекции ключи должны быть уникальными. Если вы по ошибке укажете один и тот же ключ несколько раз, то получите исключение времени выполнения.
Взгляните на следующий метод, который наполняет Dictionary<K,V> разнообразными объектами. Обратите внимание, что при создании объекта Dictionary<TKey,TValue> в качестве аргументов конструктора передаются тип ключа (ТКеу) и тип внутренних объектов (TValue). В этом примере для ключа указывается тип данных string, а для значения — тип Person. Кроме того, имейте в виду, что синтаксис инициализации объектов можно сочетать с синтаксисом инициализации коллекций.
private static void UseDictionary()
{
// Наполнить с помощью метода Add()
Dictionary<string, Person> peopleA = new Dictionary<string, Person>();
peopleA.Add("Homer", new Person { FirstName = "Homer",
LastName = "Simpson", Age = 47 });
peopleA.Add("Marge", new Person { FirstName = "Marge",
LastName = "Simpson", Age = 45 });
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})peopleA.Add("Lisa", new Person { FirstName = "Lisa",
LastName = "Simpson", Age = 9 });
// Получить элемент с ключом Homer.
Person homer = peopleA["Homer"];
Console.WriteLine(homer);
// Наполнить с помощью синтаксиса инициализации.
Dictionary<string, Person> peopleB = new Dictionary<string, Person>()
{
{ "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 } }
};
// Получить элемент с ключом Lisa.
Person lisa = peopleB["Lisa"];
Console.WriteLine(lisa);
}
Наполнять Dictionary<TKey,TValue> также возможно с применением связанного синтаксиса инициализации, который является специфичным для контейнера данного типа (вполне ожидаемо называемый инициализацией словарей). Подобно синтаксису, который использовался при наполнении объекта personB в предыдущем примере, для объекта коллекции определяется область инициализации; однако можно также применять индексатор, чтобы указать ключ, и присвоить ему новый объект:
// Наполнить с помощью синтаксиса инициализации словарей.
Dictionary<string, Person> peopleC = new Dictionary<string, Person>()
{
["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 документированы два класса, о которых вы обязательно должны быть осведомлены.
- Понимание SQL - Мартин Грубер - Базы данных