
- •Лекция №9 Тема: Коллекции. Сравнение массивов и коллекций.
- •По общим характеристикам
- •По логике организации
- •Использование простую коллекцию
- •Типы коллекций
- •Классы System.Collections.Concurrent
- •Классы System.Collections
- •Реализация коллекцию клавиши " ключ-значение "
- •Использование linq для доступа к коллекции
- •Сортировка коллекция
- •Указание пользовательскую коллекцию
Типы коллекций
Много общих коллекций предоставляются платформой .NET Framework. Каждый тип коллекции предназначен для особой целью.
Следующие группы в составе классы коллекций, описанных в этом разделе:
Классы System.Collections.Generic
Классы System.Collections.Concurrent
Классы System.Collections
Класс Collection Visual Basic
Можно создать родовая коллекцию с помощью одного из классов в пространстве имен System.Collections.Generic. Универсальная коллекция применяется в том случае, если все элементы в коллекции имеют одинаковый тип данных. Родовая коллекция принудительно строгая типизация, включив только необходимый тип данных для добавления.
В следующей таблице перечислены некоторые из часто используемых классов пространства имен System.Collections.Generic:
Дополнительные сведения см. в описаниях Часто используемые типы коллекций, Выбор класса коллекции и System.Collections.Generic.
Классы System.Collections.Concurrent
В платформе .NET Framework 4 коллекций в пространстве имен System.Collections.Concurrent предоставляют эффективные потокобезопасные операции для доступа к элементам коллекции из нескольких потоков.
Классы в пространстве имен System.Collections.Concurrent должны использоваться вместо соответствующих типов в System.Collections.Generic и пространства имен System.Collections, когда несколько потоков обращаются к коллекции одновременно. Дополнительные сведения см. в разделах Потокобезопасные коллекции и System.Collections.Concurrent.
Некоторые классы, включенные в пространстве имен System.Collections.ConcurrentBlockingCollection<T>, ConcurrentDictionary<TKey, TValue>, ConcurrentQueue<T> и ConcurrentStack<T>.
Классы System.Collections
Классы в пространстве имен System.Collections не хранят элементы в виде конкретно типизированных объектов, а хранят их как объекты типа Object.
При возможности следует использовать родовые коллекций в пространстве имен System.Collections.Generic или пространстве имен System.Collections.Concurrent вместо устаревших типов в пространстве имен System.Collections.
В следующей таблице перечислены некоторые из часто используемых классов в пространстве имен System.Collections:
Пространство имен System.Collections.Specialized предоставляет специализированные строго типизированные классы коллекций, такие как коллекции строк, связанные списки и гибридные словари.
Реализация коллекцию клавиши " ключ-значение "
Коллекция Dictionary<TKey, TValue> родовая позволяет получить доступ к элементам коллекции с помощью клавиши каждого элемента. Каждый элемент, добавляемый словарь, состоит из значения и связанного с ним ключа. Извлечение значения с помощью его клавиши быстрого поскольку класс Dictionary реализован как хэш-таблицы.
В следующем примере создается коллекция Dictionary и последовательно перебирает словарь с помощью выписки For Each.
private void IterateThruDictionary()
{
Dictionary<string, Element> elements = BuildDictionary();
foreach (KeyValuePair<string, Element> kvp in elements)
{
Element theElement = kvp.Value;
Console.WriteLine("key: " + kvp.Key);
Console.WriteLine("values: " + theElement.Symbol + " " +
theElement.Name + " " + theElement.AtomicNumber);
}
}
private Dictionary<string, Element> BuildDictionary()
{
var elements = new Dictionary<string, Element>();
AddToDictionary(elements, "K", "Potassium", 19);
AddToDictionary(elements, "Ca", "Calcium", 20);
AddToDictionary(elements, "Sc", "Scandium", 21);
AddToDictionary(elements, "Ti", "Titanium", 22);
return elements;
}
private void AddToDictionary(Dictionary<string, Element> elements,
string symbol, string name, int atomicNumber)
{
Element theElement = new Element();
theElement.Symbol = symbol;
theElement.Name = name;
theElement.AtomicNumber = atomicNumber;
elements.Add(key: theElement.Symbol, value: theElement);
}
public class Element
{
public string Symbol { get; set; }
public string Name { get; set; }
public int AtomicNumber { get; set; }
}
Вместо того, чтобы использовать инициализатор набора для построения коллекцию Dictionary, можно заменить методы BuildDictionary и AddToDictionary следующим приемом.
private Dictionary<string, Element> BuildDictionary2()
{
return new Dictionary<string, Element>
{
{"K",
new Element() { Symbol="K", Name="Potassium", AtomicNumber=19}},
{"Ca",
new Element() { Symbol="Ca", Name="Calcium", AtomicNumber=20}},
{"Sc",
new Element() { Symbol="Sc", Name="Scandium", AtomicNumber=21}},
{"Ti",
new Element() { Symbol="Ti", Name="Titanium", AtomicNumber=22}}
};
}
В следующем примере используется метод ContainsKey, а свойство ItemDictionary, чтобы быстро найти элемент клавиша. Свойство Item позволяет получить доступ к элементу в коллекции elements с помощью кода elements(symbol) в Visual Basic или в C# elements[symbol].
private void FindInDictionary(string symbol)
{
Dictionary<string, Element> elements = BuildDictionary();
if (elements.ContainsKey(symbol) == false)
{
Console.WriteLine(symbol + " not found");
}
else
{
Element theElement = elements[symbol];
Console.WriteLine("found: " + theElement.Name);
}
}
В следующем примере рекомендуется использовать метод TryGetValue клавиша быстрого находит элемент.
private void FindInDictionary2(string symbol)
{
Dictionary<string, Element> elements = BuildDictionary();
Element theElement = null;
if (elements.TryGetValue(symbol, out theElement) == false)
Console.WriteLine(symbol + " not found");
else
Console.WriteLine("found: " + theElement.Name);
}