Слайд 1Лекция 17.
Коллекции
дисциплина «Программирование»
Козьминых Н.М.
Слайд 2Введение в коллекции
Козьминых Н.М.
Коллекция в C# представляет собой совокупность объектов
Коллекции
упрощают решение многих задач программирования на основе структур данных
Коллекции предназначены
для поддержки динамических массивов, связных списков, стеков, очередей и хеш-таблиц
Слайд 3Обзор коллекций
Козьминых Н.М.
Необобщенные коллекции (System.Collections): динамический массив, стек, очередь, словари.
Коллекции не типизированы, поскольку в них хранятся ссылки на данные
типа object.
Специальные коллекции (System.Collections.Specialized): коллекции для символьных строк, специальные коллекции, в которых используется однонаправленный список.
Поразрядная коллекция (System.Collections) – BitArray, поддерживающая поразрядные операции.
Обобщенные коллекции (System.Collections.Generic): связные списки, стеки, очереди и словари. Коллекции являются типизированными в силу их обобщенного характера.
Параллельные коллекции (System.Collections.Concurrent)- поддерживают многопоточный доступ к коллекции.
Слайд 4Необобщенные коллекции
Козьминых Н.М.
пространство имен System.Collections;
структуры данных общего назначения, оперирующие ссылками
на объекты;
можно хранить разнотипные данные:
«+» позволяют манипулировать объектом любого типа,
хотя и не типизированным способом;
«-» не обеспечивают типовую безопасность.
Слайд 5Классы необобщенных коллекций
Козьминых Н.М.
Слайд 6Обобщенные коллекции
Козьминых Н.М.
пространство имен System.Collections.Generic;
обобщенные коллекции типизированы;
как правило, классы обобщенных
коллекций являются не более чем обобщенными эквивалентами классов необобщенных коллекций,
например, ArrayList → List, HashTable → Dictionary;
Слайд 7Классы обобщенных коллекций
Козьминых Н.М.
Слайд 8Класс ArrayList
Козьминых Н.М.
поддерживаются динамические массивы, расширяющиеся и сокращающиеся по мере
необходимости.
свойство Count - количество объектов, хранящихся в коллекции на данный
момент
некоторые часто используемые методы:
Слайд 9Класс ArrayList - пример
Козьминых Н.М.
ArrayList arrLst = new ArrayList();
arrLst.Add("11"); outputArrayList(arrLst);
arrLst.Add("44");
outputArrayList(arrLst);
arrLst.Add("33"); outputArrayList(arrLst);
arrLst.Insert(2, "55"); outputArrayList(arrLst);
arrLst.Add("44"); outputArrayList(arrLst);
arrLst.Remove("44"); outputArrayList(arrLst);
listBox3.Items.Add("find: " + arrLst.IndexOf("55"));
arrLst.Reverse(); outputArrayList(arrLst);
...
private
void outputArrayList(ArrayList arrLst){
String ss = "";
foreach (String item in arrLst){
ss = ss + item + " , ";
}
listBox3.Items.Add(ss);
}
Слайд 10Класс Hashtable
Козьминых Н.М.
информация сохраняется в хеш-таблице с помощью механизма хеширования;
хеш-код
служит в качестве индекса, по которому в таблице хранятся искомые
данные, соответствующие заданному ключу
Слайд 11Класс Hashtable - пример
Козьминых Н.М.
Hashtable hashtable = new Hashtable();
hashtable.Add("qwe", "111");
outputHashtable(hashtable);
hashtable.Add("zxc", "222"); outputHashtable(hashtable);
hashtable.Add("asd", "666"); outputHashtable(hashtable);
...
private void outputHashtable(Hashtable arrLst){
String ss
= "";
foreach (String item in arrLst.Keys){
ss = ss + item + " : " + arrLst[item] + " , ";
}
listBox6.Items.Add(ss);
ss = "";
foreach (String item in arrLst.Values){
ss = ss + item + " , ";
}
listBox6.Items.Add(ss);
}
Слайд 12Стек: классы Stack и Stack
Козьминых Н.М.
контейнер, работающий по принципу "последний
вошел, первый вышел" (last in, first out — LIFO)
Слайд 13Стек: классы Stack и Stack - пример
Козьминых Н.М.
Stack stack =
new Stack();
stack.Push("111"); outputStack(stack);
stack.Push("222"); outputStack(stack);
stack.Push("333"); outputStack(stack);
listBox5.Items.Add("Peek: " + stack.Peek());
outputStack(stack);
listBox5.Items.Add("Pop: " +
stack.Pop());
outputStack(stack);
…
private void outputStack(Stack arrLst){
String ss = "";
foreach (String item in arrLst){
ss = ss + item + " , ";
}
listBox5.Items.Add(ss);
}
Слайд 14Очередь: классы Queue и Queue
Козьминых Н.М.
коллекция, в которой элементы обрабатываются
по схеме "первый вошел, первый вышел" (first in, first out
— FIFO)
Слайд 15Связный список: класс LinkedList
Козьминых Н.М.
двухсвязный список, в котором каждый элемент
ссылается на следующий и предыдущий
Слайд 16Связный список: класс LinkedList - пример
Козьминых Н.М.
LinkedList lst = new
LinkedList();
lst.AddFirst("111"); outputLinkedList(lst);
lst.AddLast("222"); outputLinkedList(lst);
lst.AddBefore(lst.Find("111"), "DDD");
outputLinkedList(lst);
lst.AddBefore(lst.Find("111"), "zzz");
outputLinkedList(lst);
listBox1.Items.Add("1: " + lst.ElementAt(1));
lst.Remove("DDD"); outputLinkedList(lst);
…
private void
outputLinkedList(LinkedList lst){
String ss = "";
foreach (String item in lst){
ss = ss + item + " , ";
}
listBox1.Items.Add(ss);
}
Слайд 17Сортированный список: класс SortedList
Козьминых Н.М.
коллекция, отсортированная по ключу
Слайд 18Сортированный список: класс SortedList - пример
Козьминых Н.М.
SortedList sortedList =
new SortedList();
sortedList.Add("qwe", "111"); outputSortedList(sortedList);
sortedList.Add("asd", "333"); outputSortedList(sortedList);
sortedList.Add("zxc", "222"); outputSortedList(sortedList);
private void outputSortedList(SortedList
arrLst){
String ss = "";
foreach (String item in arrLst.Keys){
ss = ss + item + " : " + arrLst[item] + " , ";
}
listBox4.Items.Add(ss);
ss = "";
foreach (String item in arrLst.Values){
ss = ss + item + " , ";
}
listBox4.Items.Add(ss);
}
Слайд 19Пример
Козьминых Н.М.
SortedList list = new SortedList();
private void
output()
{
StringBuilder result = new StringBuilder();
foreach (string key in list.Keys)
result.Append(key + ": " + list[key] + ", ");
listBox.Items.Add(result.ToString());
}
Слайд 20Пример (продолжение)
Козьминых Н.М.
private void btnAdd_Click(object sender,
EventArgs e) {
if (txtKey.Text == "") {
MessageBox.Show("Укажите ключ"); return;
}
if (txtValue.Text == "") {
MessageBox.Show("Укажите значение"); return;
}
if (list.ContainsKey(txtKey.Text)) {
MessageBox.Show("Указанный ключ уже существует"); return;
}
list.Add(txtKey.Text, txtValue.Text);
output();
}
private void btnDelete_Click(object sender, EventArgs e) {
if (!list.ContainsKey(txtKey.Text)) {
MessageBox.Show("Указанного ключа уже существует"); return;
}
list.Remove(txtKey.Text);
output();
}
Слайд 21Словарь: класс Dictionary
Козьминых Н.М.
сложная структура данных, позволяющая обеспечить доступ
к элементам по ключу;
главное свойство словарей — быстрый поиск на
основе ключей.
Слайд 22Словарь: класс Dictionary - пример
Козьминых Н.М.
Dictionary dict =
new Dictionary();
dict.Add("qwe", "111"); outputDictionary(dict);
dict.Add("asd", "666"); outputDictionary(dict);
dict.Add("zxc", "444"); outputDictionary(dict);
…
private void
outputDictionary(Dictionary arrLst){
String ss = "";
foreach (String item in arrLst.Keys){
ss = ss + item + " : " + arrLst[item] + " , ";
}
listBox7.Items.Add(ss);
ss = "";
foreach (String item in arrLst.Values){
ss = ss + item + " , ";
}
listBox7.Items.Add(ss);
}
Слайд 23Множества: классы HashSet и SortedSet
Козьминых Н.М.
коллекция, содержащаяся только отличающиеся элементы
Слайд 24Множества: классы HashSet и SortedSet - пример
Козьминых Н.М.
SortedSet sSortSet =
new SortedSet();
sSortSet.Add("111"); outputSortedSet(sSortSet);
sSortSet.Add("555"); outputSortedSet(sSortSet);
sSortSet.Add("222"); outputSortedSet(sSortSet);
SortedSet sSortSet2 = new SortedSet();
sSortSet2.Add("111");
listBox2.Items.Add( sSortSet2.IsSubsetOf(sSortSet));
outputSortedSet(sSortSet);
…
private
void outputSortedSet(SortedSet sSortSet){
String ss = "";
foreach (String item in sSortSet){
ss = ss + item + " , ";
}
listBox2.Items.Add(ss);
}
Слайд 25Вопросы…
Спасибо за внимание
Козьминых Н.М.